2016-10-03 34 views
13

Tôi đang cố gắng thêm vào danh sách tệp "mới được sử dụng" từ Python 3 trên Ubuntu.Làm cách nào để thêm một mục vào danh sách tệp "được sử dụng gần đây" của GTK từ Python?

tôi có thể thành công đọc danh sách tập tin vừa sử dụng như thế này:

from gi.repository import Gtk 
recent_mgr = Gtk.RecentManager.get_default() 
for item in recent_mgr.get_items(): 
    print(item.get_uri()) 

này in ra cùng một danh sách các tập tin tôi thấy khi nhìn vào "gần đây" trong Nautilus, hoặc nhìn vào vị trí "Được sử dụng gần đây" trong hộp thoại tệp của các ứng dụng như GIMP.

Tuy nhiên, khi tôi cố gắng thêm một mục như thế này (nơi /home/laurence/foo/bar.txt là một tập tin văn bản hiện hành) ...

recent_mgr.add_item('file:///home/laurence/foo/bar.txt') 

... các tập tin không hiển thị trong phần gần đây của Nautilus hoặc trong hộp thoại tập tin. Nó thậm chí không hiển thị trong kết quả được trả về bởi get_items().

Làm cách nào để thêm tệp vào danh sách tệp được sử dụng gần đây của GTK từ Python?

+1

@oldtechaa Danh sách các file vừa nghe thấy bởi Nautilus và hộp thoại tập tin trong các ứng dụng khác (kể cả GIMP, Inkscape, và thậm chí Chrome) dường như giống hệt nhau. Nhiều ứng dụng mặc định lọc danh sách thành loại tệp riêng của chúng, nhưng nếu bạn thay đổi bộ lọc thành "Tất cả tệp", bạn sẽ thấy chính xác danh sách mà Nautilus hiển thị và được hiển thị bằng mã trong câu hỏi. –

+0

'return_item()' return là gì? – andlabs

+0

@andlabs Gọi 'add_item()' trả về 'True'. (Trên thực tế, dường như luôn luôn trả về 'True', ngay cả khi URI mà tôi truyền vào nó là vô nghĩa hay hoàn toàn vô nghĩa. Ngoại lệ duy nhất là nếu tôi chuyển nó thành' non'str'. Sau đó nó tăng 'TypeError'.) –

Trả lời

12

A Gtk.RecentManager cần phát ra tín hiệu changed để cập nhật được ghi trong thuộc tính riêng của lớp C++. Để sử dụng một đối tượng RecentManager trong một ứng dụng, bạn cần phải bắt đầu vòng lặp sự kiện bằng cách gọi Gtk.main:

from gi.repository import Gtk 

recent_mgr = Gtk.RecentManager.get_default() 
uri = r'file:/path/to/my/file' 
recent_mgr.add_item(uri) 
Gtk.main() 

Nếu bạn không gọi Gtk.main(), tín hiệu changed không được phát ra và không có gì xảy ra.

Để trả lời truy vấn @andlabs, lý do tại sao RecentManager.add_item trả về boolean là do hàm g_file_query_info_async được gọi. Hàm gọi lại gtk_recent_manager_add_item_query_info sau đó tập hợp mimetype, tên ứng dụng và lệnh thành cấu trúc GtkRecentData và cuối cùng gọi gtk_recent_manager_add_full. Nguồn là here.

Nếu bất cứ điều gì sai, nó là tốt sau khi add_item đã hoàn tất, vì vậy phương pháp này chỉ trả về True nếu đối tượng đó được gọi là từ là một RecentManager và nếu uri không phải là NULL; và False nếu không.

Các tài liệu không chính xác khi nói:

Returns TRUE nếu mục mới đã được thêm thành công vào danh sách các nguồn lực sử dụng gần đây

như trở TRUE chỉ có nghĩa là một chức năng không đồng bộ đã được kêu gọi để đối phó với việc bổ sung một mục mới.

Theo đề nghị của Laurence Gonsalves, sau đây chạy giả đồng bộ:

from gi.repository import Gtk, GObject 

recent_mgr = Gtk.RecentManager.get_default() 
uri = r'file:/path/to/my/file' 
recent_mgr.add_item(uri) 
GObject.idle_add(Gtk.main_quit) 
Gtk.main() 
Các vấn đề liên quan