被破坏的对话框没有正确显示

时间:2012-10-12 21:07:15

标签: python user-interface pygtk glade

我正在使用Python / Glade中的GUI应用程序,并且遇到以下问题。 我试图让一个关于对话框正常工作......但是当我点击“关闭”(在“关于”对话框中)然后再次尝试打开它时,这就是我所看到的:

enter image description here

所以,只是窗口的一小部分片段和一个无法正常工作的关闭按钮。 这是我的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())

2 个答案:

答案 0 :(得分:3)

不要尝试(深度)复制小部件。你发现它不起作用。

而是hide()对话框,而不是destroy()

答案 1 :(得分:1)

你甚至可以使用run()。你不应该使用destroy()。是什么让你觉得,你不应该一起使用run()和hide()?当你销毁一个小部件时,看到这意味着将它从内存中删除,就好像它从未构建过一样。如果你隐藏它,你可以在以后重复使用它,但要注意用户可能对它做的更改,因为窗口将重新出现在隐藏之前的状态。您可以在隐藏时从代码中操作窗口小部件属性。

"预定义"关闭按钮的操作是由run()引起的。您使用lambda函数发布的解决方案仅比run()为您所做的更多。基本上它执行以下操作:

  • 连接"响应"您的DialogWindow的信号
  • 连接"删除事件"您的DialogWindow的信号
  • 启动新的Gtk主循环以阻止应用程序
  • 显示您的小部件
  • 断开信号
  • 返回回复

你只需要在之后隐藏()并且能够再次运行()它。