Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 重新打开窗口抛出Gtk CRITICAL**:Gtk_widget_get_窗口:断言';GTK#u是#u小部件(WIDGET)和#x27;失败_Python_Python 3.x_Gtk3 - Fatal编程技术网

Python 重新打开窗口抛出Gtk CRITICAL**:Gtk_widget_get_窗口:断言';GTK#u是#u小部件(WIDGET)和#x27;失败

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关

我有简单的python3+gtk3代码,它连接到dbus并侦听所有事件。当用户点击托盘中的图标时,他必须看到显示了所有早期事件的窗口。代码(我不知道问题出在哪里,代码大小>100行):

如何复制:

  • 运行
    python main.py
  • 单击任务栏中的应用程序图标-将打开窗口,如果运行后显示任何通知,它可以是空的,也可以包含一些项目
  • 关上窗户
  • 重试步骤#2,您将看到空窗口(在所有情况下都没有任何元素,是的,这是错误,但与此问题无关)
  • 单击窗口主体,应用程序将崩溃:

    (gui.py:4882):Gtk关键**:Gtk_小部件_获取窗口:断言“Gtk_是_小部件(小部件)”失败
    [1]
    4882分段错误(内核转储)python gui.py

  • 在第一个windowOpen事件和第二个windowOpen事件上
    self。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()
    });