Python 重新打开窗口抛出Gtk CRITICAL**:Gtk_widget_get_窗口:断言';GTK#u是#u小部件(WIDGET)和#x27;失败
我有简单的python3+gtk3代码,它连接到dbus并侦听所有事件。当用户点击托盘中的图标时,他必须看到显示了所有早期事件的窗口。代码(我不知道问题出在哪里,代码大小>100行): 如何复制:Python 重新打开窗口抛出Gtk CRITICAL**:Gtk_widget_get_窗口:断言';GTK#u是#u小部件(WIDGET)和#x27;失败,python,python-3.x,gtk3,Python,Python 3.x,Gtk3,我有简单的python3+gtk3代码,它连接到dbus并侦听所有事件。当用户点击托盘中的图标时,他必须看到显示了所有早期事件的窗口。代码(我不知道问题出在哪里,代码大小>100行): 如何复制: 运行python main.py 单击任务栏中的应用程序图标-将打开窗口,如果运行后显示任何通知,它可以是空的,也可以包含一些项目 关上窗户 重试步骤#2,您将看到空窗口(在所有情况下都没有任何元素,是的,这是错误,但与此问题无关) 单击窗口主体,应用程序将崩溃: (gui.py:4882):Gtk关
python main.py
[1]
4882分段错误(内核转储)python gui.pyself。window
对象是
gdb结果:
(main.py:17310): Gtk-CRITICAL **: gtk_widget_get_window: assertion 'GTK_IS_WIDGET (widget)' failed
Thread 1 "python" received signal SIGSEGV, Segmentation fault.
0x00007fffea5cd0b8 in gtk_widget_translate_coordinates () from /usr/lib/libgtk-3.so.0
请给我解释一下如何调试和修复这个问题
PS:我是Python新手,这就是为什么这个问题可能很愚蠢。第1课:永远不要假设bug是无关的 第2课:GTK事件令人困惑 出现此错误的原因是,当您在步骤3中关闭窗口时,窗口实际上已被删除,因此窗口中的所有窗口小部件都将成为孤立窗口(它们没有父窗口),并因此被清除。第二次在步骤4中打开窗口时,该窗口仅包含对导致分段错误的已删除小部件的引用
解决方案非常简单,只需将
return True
添加到closeWindow
中,这将让GTK知道事件已被处理,并且它不应该执行关闭窗口(您已经隐藏)的默认操作。另一个优雅的解决方案可能是使用hide\u on\u delete
函数。例如,在Rust中(很容易重写为Python):
my_window.connect_delete_event(move |_win,_| {
_win.hide_on_delete()
});