Glade,pygobject - 关闭并打开一个窗口 - Gtk-CRITICAL错误和崩溃

时间:2018-06-01 19:55:05

标签: gtk3 glade pygobject

我用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"按钮触发完全相同的功能。为什么让我再次重新打开窗户,而另一个人却没有?我真的不明白什么是错的。

非常感谢您的帮助!

1 个答案:

答案 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()并完成。