Я создал приложение PyGTK, которое показывает диалог, когда пользователь нажимает кнопку.Диалог загружается в моем методе __init__
с помощью:
builder = gtk.Builder()
builder.add_from_file("filename")
builder.connect_signals(self)
self.myDialog = builder.get_object("dialog_name")
В обработчике событий диалог отображается с командой self.myDialog.run()
, но это работает только один раз, потому что после run()
диалоговое окноавтоматически уничтожается.Если я нажимаю кнопку еще раз, приложение вылетает.
Я прочитал, что есть способ использовать show()
вместо run()
, когда диалог не разрушен, но я чувствую, что это не такправильный путь для меня, потому что я хотел бы, чтобы диалог вел себя модально и возвращал управление коду только после того, как пользователь закрыл его.
Есть ли простой способ многократно показывать диалог, используя run()
метод с помощью gtkbuilder?Я попытался перезагрузить весь диалог с помощью gtkbuilder, но, похоже, это не сработало, в диалоговом окне отсутствовали все дочерние элементы (и я бы предпочел использовать построитель только один раз, в начале программы).
[РЕШЕНИЕ] (отредактировано)
Как указано в ответе ниже, использование hide()
помогает.Сначала я подумал, что вам нужно поймать «delete-event», но на самом деле это не обязательно.Простой пример, который работает:
import pygtk
import gtk
class DialogTest:
def rundialog(self, widget, data=None):
self.dia.show_all()
result = self.dia.run()
self.dia.hide()
def destroy(self, widget, data=None):
gtk.main_quit()
def __init__(self):
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.connect("destroy", self.destroy)
self.dia = gtk.Dialog('TEST DIALOG', self.window,
gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT)
self.dia.vbox.pack_start(gtk.Label('This is just a Test'))
self.button = gtk.Button("Run Dialog")
self.button.connect("clicked", self.rundialog, None)
self.window.add(self.button)
self.button.show()
self.window.show()
if __name__ == "__main__":
testApp = DialogTest()
gtk.main()