【发布时间】:2018-06-01 19:55:04
【问题描述】:
我用 Glade 和 pygobject 创建了一个双窗口应用程序。我有一个带有打开窗口按钮的窗口,可以打开第二个窗口。第二个窗口有一个关闭按钮。当我单击关闭按钮时,它会在终端上打印一些内容并触发“.hide_on_delete()”函数,该函数会关闭第二个窗口。
当我再次单击打开窗口按钮时,它会再次使用简单的“.show()”打开窗口。而且我可以随心所欲地这样做。
但是,当我使用右上角的“x”而不是我创建的关闭按钮关闭第二个窗口时,会出现问题。在林间空地中,我设置了“销毁”事件并为其指定了正确的函数名称。当我通过“x”关闭第二个窗口时,它甚至会打印出“Clicked on the X button”并关闭第二个窗口。但是当我再次打开它时,我只是得到一个没有窗口装饰的黑色方块,当我点击它时,我收到以下错误消息:
(main.py:11083): Gtk-CRITICAL **: 21:37:50.904: gtk_widget_get_window: assertion 'GTK_IS_WIDGET (widget)' failed
(main.py:11083): Gtk-CRITICAL **: 21:37:50.905: gtk_widget_translate_coordinates: assertion 'GTK_IS_WIDGET (dest_widget)' failed
(main.py:11083): Gtk-CRITICAL **: 21:37:50.905: gtk_widget_get_window: assertion 'GTK_IS_WIDGET (widget)' failed
(main.py:11083): Gtk-CRITICAL **: 21:37:50.905: gtk_widget_translate_coordinates: assertion 'GTK_IS_WIDGET (dest_widget)' failed
(main.py:11083): Gtk-CRITICAL **: 21:37:50.905: gtk_widget_get_settings: assertion 'GTK_IS_WIDGET (widget)' failed
/usr/lib/python3.6/site-packages/gi/overrides/Gtk.py:1612: Warning: g_object_get: assertion 'G_IS_OBJECT (object)' failed
return _Gtk_main(*args, **kwargs)
(main.py:11083): Gtk-CRITICAL **: 21:37:50.905: gtk_widget_get_window: assertion 'GTK_IS_WIDGET (widget)' failed
(main.py:11083): Gtk-CRITICAL **: 21:37:50.905: gtk_widget_translate_coordinates: assertion 'GTK_IS_WIDGET (dest_widget)' failed
(main.py:11083): Gtk-CRITICAL **: 21:37:50.977: gtk_widget_get_window: assertion 'GTK_IS_WIDGET (widget)' failed
(main.py:11083): Gtk-CRITICAL **: 21:37:50.977: gtk_widget_translate_coordinates: assertion 'GTK_IS_WIDGET (dest_widget)' failed
(main.py:11083): Gtk-CRITICAL **: 21:37:50.977: gtk_widget_get_window: assertion 'GTK_IS_WIDGET (widget)' failed
(main.py:11083): Gtk-CRITICAL **: 21:37:50.977: gtk_widget_get_window: assertion 'GTK_IS_WIDGET (widget)' failed
这是我的功能:
def on_second_window_destroy(self, *args):
print("x Button clicked")
app.builder.get_object("second_window").hide_on_delete()
def on_new_window_button_clicked(self, *args):
app.builder.get_object("second_window").show()
def on_close_button_clicked(self, *args):
print("close Button clicked")
app.builder.get_object("second_window").hide_on_delete()
关闭按钮和“x”按钮触发完全相同的功能。为什么一个让我重新打开窗口而另一个不让我重新打开窗口?我真的不明白这是怎么回事。
非常感谢您的帮助!
【问题讨论】:
-
我不得不删除我的答案,因为它可能是绝对错误的。关于系统
x,您是否连接到“delete-event”、“destroy”或“destroy-event”?因为文档说Connecting gtk_widget_hide_on_delete() to this signal ("delete-event") will cause the window to be hidden instead, so that it can later be shown again without reconstructing it -
再次感谢您的帮助。我将“销毁”更改为“删除事件”信号,但我遇到了同样的错误。但是我创建了一个 MCVE,您可以在这里找到它:pastebin.com/efXHZqNP 我仔细检查了它,但它仍然无法正常工作。通过关闭按钮“隐藏”窗口并再次打开它可以工作,通过“x”按钮隐藏它并重新打开仍然会出现错误。你知道为什么会这样吗?