“销毁关于”对话框无法正确重新显示

2024-09-29 23:21:00 发布

您现在位置:Python中文网/ 问答频道 /正文

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

{1美元^

所以,只是窗口的一小部分,还有一个不起作用的关闭按钮。 这是我为我的空地之窗上课:

# 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()

在我的主要职能是:

^{pr2}$

在第二次单击时,我在终端窗口中看到以下输出(使用macosx)。在

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())

Tags: runselfgtkobjectmaindefshowbuilder
2条回答

不要试图(深入)复制一个小部件。你发现这不管用。在

取而代之的是,hide()而不是destroy()对话框。在

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

关闭按钮的“预定义”操作是由run()引起的。使用lambda函数发布的解决方案只不过是run()为您做的事情。基本上它可以做到以下几点:

  • 连接对话框窗口的“响应”信号
  • 连接对话框窗口的“删除事件”信号
  • 启动一个新的Gtk主循环来阻止应用程序
  • 显示小工具
  • 断开信号
  • 返回响应

您只需在之后隐藏()它,然后就可以再次运行()它。在

相关问题 更多 >

    热门问题