Glade,pygobject - 关闭和打开 window - Gtk-CRITICAL 错误和崩溃

Glade, pygobject - closing and opening a window - Gtk-CRITICAL error and crash

我用 Glade 和 pygobject 创建了一个双 window 应用程序。我有一个 window,带有一个打开 window 按钮,可以打开第二个 window。第二个 window 有一个关闭按钮。当我单击关闭按钮时,它会向终端打印一些内容并触发“.hide_on_delete()”函数,该函数会关闭第二个 window.

当我再次单击打开-window-按钮时,它会再次使用简单的“.show()”打开window。我可以随心所欲地这样做。

但是,当我使用右上角的 "x" 而不是我创建的关闭按钮关闭第二个 window 时出现问题。在 glade 中,我设置了 "destroy" 事件并给了它正确的函数名称。当我通过 "x" 关闭第二个 window 时,它甚至打印出 "Clicked on the X button" 并关闭第二个 window。但是当我再次打开它时,我只看到一个没有 window 装饰的黑色方块,当我点击它时,我收到这个错误信息:

(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"按钮触发完全相同的功能。为什么一个让我重新打开 window 而另一个不让我重新打开?我真的不明白哪里不对。

非常感谢您的帮助!

正如我在评论中提到的,您应该连接到 "delete-event" 信号。它的回调看起来像这样:

gboolean
user_function (GtkWidget *widget,
               GdkEvent  *event,
               gpointer   user_data)

您必须 return True 才能阻止为该事件调用其他处理程序。 False 进一步传播事件。

Gtk.Widget.hide_on_delete() 总是 return 为真,这就是为什么将此函数直接连接到信号停止发射的原因。于是,写return app.builder.get_object("second_window").hide_on_delete()就完成了。