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()
就完成了。
我用 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()
就完成了。