Не удается закрыть диалоговое окно GTK - PullRequest
0 голосов
/ 24 февраля 2019

Я использую gtk для создания диалогового окна выбора файла:

from gi.repository import Gtk
import time

dialog = Gtk.FileChooserDialog("World to load:", None,
                               Gtk.FileChooserAction.OPEN,
    (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
    Gtk.STOCK_OPEN, Gtk.ResponseType.OK))

response = dialog.run()
if response == Gtk.ResponseType.OK:
    print("load", dialog.get_filename())
else:
    print("cancel")

dialog.destroy()

time.sleep(5)

Код работает: я получаю либо имя файла, либо 'отмена напечатана.Но окно выбора не закрывается до выхода программы через 5 секунд.Там просто висит окно, программа запускается дальше и отзывчива.Насколько я могу сказать, замена dialog.destroy() на dialog.hide() ничего не меняет.

Я получаю предупреждение:

Gtk-Message: 10:27:04.843: GtkDialog mapped without a transient parent. This is discouraged.

не уверен, связано ли это.

Я пробовал различные версии Gtk.main(), Gtk.main_quit() и другие способы форсирования основного цикла, однако мое (по общему признанию, несовершенное) чтение заключается в том, что файловый диалог реализует сами циклы и не нуждается в основном цикле.

Кто-нибудь может помочь мне закрыть это окно?

Я использую python 3.6.7, gi 3.26.1 в Ubuntu 18.04

1 Ответ

0 голосов
/ 25 февраля 2019

Вот решение, которое работает на мою цель.Вкратце, он включает время ожидания GLib, которое закрывает / скрывает главное окно, и цикл Gtk.main (), который выполняет очистку окна.Вот исправленный код:

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, GLib
import time

def onTimeout():
    Gtk.main_quit()
    return False

win = Gtk.Window(title="test")

dialog = Gtk.FileChooserDialog("World to load:", win,
                               Gtk.FileChooserAction.OPEN,
    (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
    Gtk.STOCK_OPEN, Gtk.ResponseType.OK))
response = dialog.run()
if response == Gtk.ResponseType.OK:
    print("load", dialog.get_filename())
else:
    print("cancel")

dialog.destroy()
GLib.timeout_add(100, onTimeout)
Gtk.main()
print("window closed, wait")

time.sleep(5)

Я был бы рад узнать о более чистом решении, если кто-то может предложить его.Заставить главный цикл выполнить очистку и тайм-аут для выхода кажется странным.

...