我正在使用Python / Glade中的GUI应用程序,并且遇到以下问题。 我试图让一个关于对话框正常工作......但是当我点击“关闭”(在“关于”对话框中)然后再次尝试打开它时,这就是我所看到的:
所以,只是窗口的一小部分片段和一个无法正常工作的关闭按钮。 这是我的Glade窗口的课程:
# glade object
class MainWindow(object):
builder_ = None
# load main window
def __init__(self):
handler = {
"sigWindowDestroy" : gtk.main_quit,
"sigShowAbout" : self.show_about
}
projfile = "proj.glade"
self.builder_ = gtk.Builder()
self.builder_.add_from_file(projfile)
self.builder_.connect_signals(handler)
window = self.builder_.get_object("main_window")
window.show()
# show about dialog
def show_about(self, *args):
dAbout = self.builder_.get_object("dAbout")
dAbout.run()
dAbout.destroy()
在我的主要功能中:
# load glade gui
app = MainWindow()
gtk.main()
在第二次单击时,我在终端窗口中看到以下输出(使用Mac OS X)。
GtkWarning: gtk_widget_show: assertion `GTK_IS_WIDGET (widget)' failed
dAbout.run()
GtkWarning: gtk_label_set_markup: assertion `GTK_IS_LABEL (label)' failed
dAbout.run()
编辑:抱歉,必须重新打开,因为对PyGTK一般不熟悉。
我使用的是show()/hide()
方法,而不是run()/destroy()
。现在,我正在跟随另一篇SO帖子,其中突出显示this tutorial(谁说使用run()/destroy()
),并且看到了这种行为。
首先,“关闭”按钮不执行任何操作。我原因认为它的行为是预定义的。
其次,使用角点关闭按钮关闭对话框仍然提供与上面run()/destroy()
相同的行为。
编辑2:通过添加以下内容解决:
dAbout.connect("response", lambda d, r: d.hide())
答案 0 :(得分:3)
不要尝试(深度)复制小部件。你发现它不起作用。
而是hide()
对话框,而不是destroy()
。
答案 1 :(得分:1)
你甚至可以使用run()。你不应该使用destroy()。是什么让你觉得,你不应该一起使用run()和hide()?当你销毁一个小部件时,看到这意味着将它从内存中删除,就好像它从未构建过一样。如果你隐藏它,你可以在以后重复使用它,但要注意用户可能对它做的更改,因为窗口将重新出现在隐藏之前的状态。您可以在隐藏时从代码中操作窗口小部件属性。
"预定义"关闭按钮的操作是由run()引起的。您使用lambda函数发布的解决方案仅比run()为您所做的更多。基本上它执行以下操作:
你只需要在之后隐藏()并且能够再次运行()它。