Проблема с Dock на MacOS в приложении wxPython - PullRequest
2 голосов
/ 20 августа 2011

Проблема с док-станцией в MacOS.В контекстном меню в dock-icon есть 2 пункта: Standart Quit of MacOS и некоторый пункт меню Quit, который я не добавил.Это Quit, а не мое, работает и связано с моим методом:

class TrayIcon(wx.TaskBarIcon):
    def make_menu(self):
        self.menu = wx.Menu()
        item = self.menu.Append(wx.ID_EXIT,"Exit", "Exit from application")
        self.menu.Bind(wx.EVT_MENU, self.on_menu_exit, item)

    def CreatePopupMenu(self):
        self.make_menu()
        return self.menu

Как видите, я называю это «Выход», но я вижу «Выход», но он все еще обрабатывает мой метод.

И выйдите из системы, она не будет работать, когда я ее выберу, ничего не происходит, но следующие действия с приложением приводят к этому сообщению об ошибке:

File "/ var/tmp/wxWidgets/wxWidgets-13~231/2.6/DSTROOT/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/wx-2.8-mac-unicode/wx/_core.py»,строка 14501, в getattr wx._core.PyDeadObjectError: C ++ часть основного объекта удалена, доступ к атрибуту больше не разрешен.

Что я сделал не так?Спасибо

1 Ответ

2 голосов
/ 16 января 2013

Возможно, причина в том, что вы не сохраняете ссылку на item. Он ограничен self.menu.Bind, но вы не сохраняете ссылку в коде Python. Таким образом, сборщик мусора Python видит этот wx.MenuItem, на который больше нет ссылок (в коде Python), поэтому он удаляется. Вызывается код очистки Wx (__del__), и объект также удаляется из кода C ++, , хотя он все еще используется! . Поэтому, когда вы щелкаете по пункту меню, он пытается сопоставить выбранный пункт меню с (к тому времени) удаленным пунктом меню и выдает вышеупомянутый PyDeadObjectError. Чтобы обойти эту «ошибку», просто сохраните ссылку на wx.MenuItem:

self.item = self.menu.Append(...
...