我有简单的 python3 + gtk3 代码,它连接到 dbus 并监听所有事件。当用户单击托盘中的图标时,他必须看到包含所有显示的早期事件的窗口。代码(我不知道问题出在哪里并且代码大小> 100行):https://github.com/rakshazi/notify-feed/blob/master/main.py
如何重现:
- 运行
python main.py
L117 - 单击托盘中的应用程序图标 - 将打开窗口,它可以是空的,也可以包含一些项目(如果运行后显示任何通知)。 L83
- 关闭窗口。 L93
- 重试步骤#2,您将看到空窗口(在所有情况下都没有任何元素,是的,这是错误,但对于这个问题来说并不重要)
点击窗口主体,应用程序将崩溃:
(gui.py:4882): Gtk-CRITICAL **: gtk_widget_get_window: 断言“GTK_IS_WIDGET(小部件)”失败
[1]
4882 段错误(核心转储)python gui.py
在第一个 windowOpen 事件和第二个 windowOpen 事件上 self.window
对象是<__main__.Window object at 0x7f98b1dcd7e0 (__main__+Window at 0x1502260)>
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 知道该事件已被处理并且它不应该执行关闭窗口的默认操作窗口(您已经隐藏的)。
关于python - 重新打开窗口抛出 Gtk-CRITICAL ** : gtk_widget_get_window: assertion 'GTK_IS_WIDGET (widget)' failed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40736476/