2

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

在此处输入图像描述

因此,只是窗口的一小部分,以及一个不起作用的关闭按钮。这是我的 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 帖子,该帖子突出显示了本教程(谁说要使用run()/destroy()),并且看到了这种行为。

首先,关闭按钮什么都不做。出于某种原因,我曾认为它的行为是预先定义的。其次,使用角关闭按钮关闭对话框仍然提供与我在上面看到的相同的行为run()/destroy()


编辑2:通过添加以下内容解决:

dAbout.connect("response", lambda d, r: d.hide())
4

2 回答 2

3

不要尝试(深度)复制小部件。正如你发现的那样,它不起作用。

相反,hide()对话框而不是destroy()ing 它。

于 2012-10-15T13:09:04.293 回答
1

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

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

  • 连接 DialogWindow 的“响应”信号
  • 连接 DialogWindow 的“删除事件”信号
  • 启动一个新的 Gtk 主循环来阻塞应用程序
  • 显示您的小部件
  • 断开信号
  • 返回响应

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

于 2015-07-11T17:27:59.970 回答