2016-10-03 61 views
13

我想添加到Ubuntu上的Python 3「最近使用過的」文件列表中。如何從Python中向GTK的「最近使用」文件列表添加項目?

我能夠成功閱讀最近使用的文件列表如下:

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

這將打印出的文件的同一列表我Nautilus中看到,當我在「最近」,或看GIMP等應用程序文件對話框中的「最近使用」位置。

然而,當我嘗試添加像這樣的項目(其中/home/laurence/foo/bar.txt是現有文本文件)...

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

...文件不Nautilus中還是在最近的一節顯示文件對話框。它甚至沒有出現在由get_items()返回的結果中。

如何添加文件到GTK最近使用的Python文件列表中?

+1

@oldtechaa由鸚鵡螺和其他應用程序的文件對話框(包括GIMP,Inkscape中,甚至鍍鉻)看到最近使用的文件列表似乎是相同的。許多應用默認將列表過濾爲自己的文件類型,但是如果將過濾器更改爲「所有文件」,則會看到與Nautilus顯示的列表完全相同的列表,並且問題中的代碼顯示該列表。 –

+0

'add_item()'返回什麼? – andlabs

+0

@andlabs調用'add_item()'返回'True'。 (其實,似乎總是返回'True',即使我傳遞給它的URI不是無關緊要或完全無稽之談,唯一的例外是如果我將它傳遞給非'str',那麼會引發'TypeError'。) –

回答

12

A Gtk.RecentManager需要發出changed信號,以便將更新寫入C++類的私有屬性。要在應用程序中使用RecentManager對象,你需要通過調用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() 

如果你不叫Gtk.main(),在changed信號未發出,並沒有任何反應。

要回答@andlabs查詢,RecentManager.add_item返回布爾值的原因是因爲調用了g_file_query_info_async函數。回調函數gtk_recent_manager_add_item_query_info然後將mimetype,應用程序名稱和命令收集到GtkRecentData結構中,最後調用gtk_recent_manager_add_full。來源是here

如果出現任何錯誤,這是add_item完成後很好,所以該方法只返回True如果從調用的對象是RecentManager,如果URI不NULL;否則爲False

文檔是不準確的說法:

返回TRUE如果新項目已成功添加到最近使用的資源列表

爲返回TRUE只意味着一個異步函數調用處理添加一個新項目。

至於建議由勞倫斯·貢薩爾維斯以下運行僞同步:

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() 
相關問題