我创建了一个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()
的方法,在这种情况下对话框不会被销毁,但我觉得这对我来说不是正确的方法,因为我希望对话框表现为模态,并且仅在用户关闭它后才将控制返回给代码。使用gtkbuilder是否有一种简单的方法重复使用
run()
方法显示对话框?我尝试使用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()
self.dia.connect("delete-event", self.closedialog)
这一行,第二次单击按钮时会出现分段错误。因此,某些东西已经被销毁了,而我并没有这样做,对吧?顺便说一下,谢谢您的澄清。 - Julianclosedialog
函数,并在run()
调用后放置self.dia.hide()
即可实现你想要的效果。问题在于当你遇到段错误时,你会点击两次关闭按钮。请查看我编辑后的答案以了解原因。 - ptomato