我创建了一个 PyGTK 应用程序,当用户按下按钮时会显示一个对话框。该对话框在我的方法中加载__init__
:
builder = gtk.Builder()
builder.add_from_file("filename")
builder.connect_signals(self)
self.myDialog = builder.get_object("dialog_name")
在事件处理程序中,对话框与 command 一起显示self.myDialog.run()
,但这只能工作一次,因为在run()
对话框被自动销毁之后。如果我再次单击该按钮,应用程序将崩溃。
我读到有一种方法可以使用show()
而不是run()
对话框不被破坏,但我觉得这对我来说不是正确的方法,因为我希望对话框以模态方式运行并仅在用户之后将控制权返回给代码已关闭它。
run()
有没有一种简单的方法可以使用 gtkbuilder的方法重复显示对话框?我尝试使用 gtkbuilder 重新加载整个对话框,但这似乎并没有真正起作用,对话框缺少所有子元素(我希望在程序开始时只使用一次构建器)。
[解决方案](已编辑)
正如下面的答案所指出的,使用hide()
就可以了。我首先以为您仍然需要捕获“删除事件”,但这实际上没有必要。一个有效的简单示例是:
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()