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()
, the 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 https://github.com/GNOME/gtk/blob/master/gtk/gtkrecentmanager.c.
如果出了什么问题,那是在事后add_item
已经完成,所以该方法只是返回True
如果调用它的对象是RecentManager
如果 uri 不是NULL
; and False
否则。
该文档的说法不准确:
Returns TRUE
如果新项目已成功添加到最近使用的资源列表中
作为返回TRUE
仅意味着调用异步函数来处理新项目的添加。
正如 Laurence Gonsalves 所建议的,以下代码是伪同步运行的:
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()