2016-11-22 24 views
1

我有简单的python3 + gtk3代码,它连接到dbus并监听所有事件。当用户点击托盘中的图标时,他必须看到所有显示了早期事件的窗口。代码(我不知道在哪里的问题和代码大小> 100行):https://github.com/rakshazi/notify-feed/blob/master/main.py重新打开窗口抛出Gtk-CRITICAL **:gtk_widget_get_window:断言'GTK_IS_WIDGET(widget)'失败

如何重现:

  1. 运行python main.pyL117
  2. 点击托盘的应用程序图标 - 将打开的窗口,如果运行后显示任何通知,它可以是空的或带有一些项目。 L83
  3. 关闭窗口。 L93
  4. 重试步骤#2,你会看到空的窗口(不包括在所有情况下的任何元素,是的,这是错误的,但不要紧,这个问题)
  5. 单击窗体和应用程序将崩溃:

    (gui.py:4882):GTK的CRITICAL **:gtk_widget_get_window:断言 'GTK_IS_WIDGET(插件)' 失败 [1] 4882段故障(核心转储)蟒蛇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新手,这就是为什么这个问题可能很愚蠢。

回答

3

第1课:不要假设错误是不相关的

第2课:GTK事件扑朔迷离。

你得到这个错误的原因是因为窗口实际上在你关闭它的第3步中被删除,因此窗口中的所有窗口小部件都变成了孤儿(它们没有父窗口)并且因此被清理了。第二次在步骤4中打开窗口时,该窗口仅包含对已删除小部件的引用,从而导致您的分段错误。

解决方法非常简单,只需将return True添加到closeWindow这将让GTK知道事件已经处理,并且它不应该执行关闭窗口(您已经隐藏)的默认操作。

+0

非常感谢! – rakshazi