Ответ 1
A Gtk.RecentManager
должен излучать сигнал changed
для обновления, которое должно быть записано в приватном атрибуте класса С++. Чтобы использовать объект 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
. Источник здесь.
Если что-то пойдет не так, это хорошо после завершения 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()