2016-11-22 50 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