python - 重新打开窗口抛出 Gtk-CRITICAL ** : gtk_widget_get_window: assertion 'GTK_IS_WIDGET (widget)' failed

标签 python python-3.x gtk3

我有简单的 python3 + gtk3 代码,它连接到 dbus 并监听所有事件。当用户单击托盘中的图标时,他必须看到包含所有显示的早期事件的窗口。代码(我不知道问题出在哪里并且代码大小> 100行):https://github.com/rakshazi/notify-feed/blob/master/main.py

如何重现:

  1. 运行python main.py L117
  2. 单击托盘中的应用程序图标 - 将打开窗口,它可以是空的,也可以包含一些项目(如果运行后显示任何通知)。 L83
  3. 关闭窗口。 L93
  4. 重试步骤#2,您将看到空窗口(在所有情况下都没有任何元素,是的,这是错误,但对于这个问题来说并不重要)
  5. 点击窗口主体,应用程序将崩溃:

    (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/

相关文章:

python - scipy:插值,三次和线性

python - 使用 LibSVM 计算与 Mean/Stddev 对的最近匹配

python - python 中的 __str__ 方法

Python 3.3 PEP 418 示例给出 'namespace' 对象不可迭代错误

python - virtualenv 中的 IPython Notebook,使用 Python 3.3

python - 来自 Gtk.Entry 的插入文本信号上的 Gtk 3 位置属性始终为 0

python - 具有一对多关系的 SQLAlchemy 关系错误

python - 递归调用返回自身迭代器的对象方法

python - 如何获得 GTK 中的默认颜色?

c - c/gtk+3 程序中的段错误