我用Glade和pygobject创建了一个双窗口应用程序。我有一个带有打开窗口按钮的窗口,可以打开第二个窗口。第二个窗口有一个关闭按钮。当我点击关闭按钮时,它会向终端打印一些内容并触发" .hide_on_delete()" function,关闭第二个窗口。
当我再次单击打开窗口按钮时,它会再次使用简单的" .show()"打开窗口。我可以按照自己的意愿这样做。
然而,当我使用" x"关闭第二个窗口时会出现问题。在右上角而不是我创建的关闭按钮。在林间空地,我设置了" destroy"事件并给它正确的函数名称。当我通过" x"关闭第二个窗口时它甚至打印出来"点击X按钮"并关闭第二个窗口。但是,当我再次打开它时,我得到一个没有窗户装饰的黑色方块,当我点击它时,我收到此错误消息:
(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"按钮触发完全相同的功能。为什么让我再次重新打开窗户,而另一个人却没有?我真的不明白什么是错的。
非常感谢您的帮助!
答案 0 :(得分:1)
正如我在评论中提到的,您应该连接到"delete-event"
信号。它的回调看起来像这样:
gboolean
user_function (GtkWidget *widget,
GdkEvent *event,
gpointer user_data)
您必须返回True才能阻止为该事件调用其他处理程序。错误地进一步传播事件。
Gtk.Widget.hide_on_delete()
总是返回true,这就是为什么将此函数直接连接到信号会停止发射的原因。因此,写return app.builder.get_object("second_window").hide_on_delete()
并完成。