LINUX.ORG.RU

Вешается диалог открытия файла

 , ,


0

1

Привет всем!

Пишу приложение на Python+GTK. Наблюдаю очень странный баг, который не проявляется на одном компе и проявляется на другом. На втором он не сразу стал проявляться, а появился только недавно. При этом код моего приложения не менялся, обновлений систем не было. На обоих машинах одинаковая Ubuntu 18.04.

Из приложения надо открыть обычный диалог выбора файла:

dialog = Gtk.FileChooserDialog("Dialog", self._gui_main_window, action=Gtk.FileChooserAction.OPEN)
print("New dialog!")
response = dialog.run()
...
При этом выполнение программы наглухо вешается на первой строке, т.е. ещё до вызова response = dialog.run() и даже print не отрабатывает. Через секунд 30 в консоль выводится сообщение:
Error creating proxy: Error calling StartServiceByName for org.gtk.vfs.UDisks2VolumeMonitor: Timeout was reached (g-io-error-quark, 24)
И всё... Дальше глухо висит, диалог так и не показывается, основное окно перестаёт перерисовывать себя при изменении размеров. Если нажать Ctrl+C, то главное окно продолжает висеть, хотя консоль освобождается. Убивается через обычный kill.

Что интересно, если приложение запускать без всякой сессии, просто xterm и Xorg, то всё работает как надо, диалог открывается. А в полноценной сессии (пробовал GNOME и XFCE) случается описанный выше зависон.

Я погуглил и нашёл отдалённо похожее поведение: https://gitlab.gnome.org/GNOME/gtk/issues/1066 тут в консоль выводится аналогичное сообщение. Но, у меня этот баг срабатывает только в одном приложении (на Python, которое я пишу), в других приложениях всё нормально. /etc/fstab не содержит сетевых монтирований.

Куда копать?

=== UPD ===
Запустил с отладкой сообщений D-Bus. Перед зависанием вот что выводится в консоль:
GDBus-debug:Call:
 <<<< ASYNC COMPLETE org.freedesktop.DBus.StartServiceByName() (serial 0)
      FAILED: Timeout was reached
Как бы вообще отключить любое общение по D-Bus для GTK в рамках моего приложения? Мне оно нафиг не надо, как и UDisks2. У меня задача выбрать локальный файл.

=== UPD 2 ===
Заработало после того, как убрал из переменной GTK_MODULES запись «appmenu-gtk-module».
Вот такое содержимое данной переменной в стандартной сессии:
GTK_MODULES=appmenu-gtk-module:appmenu-gtk-module:gail:atk-bridge
, при этом не работает. А вот так:
GTK_MODULES=gail:atk-bridge
- работает.

Пока не отмечаю задачу решённой, т.к. связь одного с другим непонятная.

★★★★

В принципе, если сетевые шары и прочее барахло не нужно, можно дернуть gtk_file_chooser_set_local_only() перед запуском диалога, как паллиатив

ananas ★★★★★ ()
Ответ на: комментарий от ananas

можно дернуть gtk_file_chooser_set_local_only()

А как его дёрнуть, если вешается на dialog = Gtk.FileChooserDialog()?
В gtk_file_chooser_set_local_only() ведь надо передать экземпляр Gtk.FileChooserDialog?

ls-h ★★★★ ()
Ответ на: комментарий от ls-h

Ага. Но он есть и на той машине, где работает.

это проблемы с сессионным d-bus. или переменные окружения, типа DBUS_SESSION_BUS_ADDRES неправильно выставлены, либо права на сокет кривые, может просто сервиса нет, потому-что что-то из gvfs-ных рекомендованных пакетов недоустановлено

ananas ★★★★★ ()

Лол, может это и не связано, но у меня после установки mate (и запуска его сессии) даже после перелогина во fluxbox не работала часть скриптов, не запускались некоторые приложения и не работали вкладки браузера. Может это какой-нибудь polkit чудит или что-то в этом роде?

IPR ★★★★★ ()
Ответ на: комментарий от ananas

в твоем случае - dialog.set_local_only(True) перед dialog.run()

Если бы всё было так просто...

При этом выполнение программы наглухо вешается на первой строке, т.е. ещё до вызова response = dialog.run()

ls-h ★★★★ ()
Ответ на: комментарий от ananas

это проблемы с сессионным d-bus

А почему в других приложениях проблемы нет? Gedit, например, файлы открывает без проблем.

ls-h ★★★★ ()
Ответ на: комментарий от ananas

кстати, а что говорят «gsettings get org.gtk.Settings.FileChooser startup-mode» и «gsettings get org.gtk.Settings.FileChooser last-folder-uri»?

И на машине, где работает, и на машине, где баги:

$ gsettings get org.gtk.Settings.FileChooser startup-mode
'recent'
$ gsettings get org.gtk.Settings.FileChooser last-folder-uri
''

ls-h ★★★★ ()
Ответ на: комментарий от ananas

«gsettings get org.gtk.Settings.FileChooser startup-mode» и «gsettings get org.gtk.Settings.FileChooser last-folder-uri»

Попробовал поменять на 'cwd' и '/'. Ничего не изменилось.

ls-h ★★★★ ()

попробуй сделать такую штуку

find /usr/share/dbus-1/services -name "org.gtk.vfs.*.service" -exec sed -i 's%Exec=.*/gvfs-udisks2-volume-monitor%Exec=/bin/true%' {} \;
ananas ★★★★★ ()

Лучше всего удалить гтк с его недоделанными уродливыми диалогами и взять кути с кедами.

anonymous ()
Ответ на: комментарий от ananas

у меня такая же проблема нарисовалась недавно, попробовал эту штуку, ничего не поменялось, вернул все обратно, еще будут идеи?

agafron ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.