【问题标题】:Glade, pygobject - closing and opening a window - Gtk-CRITICAL error and crashGlade,pygobject - 关闭和打开一个窗口 - Gtk-CRITICAL 错误和崩溃
【发布时间】: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”按钮隐藏它并重新打开仍然会出现错误。你知道为什么会这样吗?

标签: gtk3 glade pygobject


【解决方案1】:

正如我在 cmets 中提到的,您应该连接到"delete-event" 信号。它的回调是这样的:

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

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

Gtk.Widget.hide_on_delete() 总是返回 true,这就是为什么直接将此函数连接到信号会停止发射。这样,写return app.builder.get_object("second_window").hide_on_delete()就完成了。

【讨论】:

  • 啊,你是对的。现在它起作用了。我不知道您必须将其与函数一起返回,而不仅仅是调用它。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多