从类外部调用实例方法会导致崩溃

时间:2015-03-22 21:08:15

标签: python tkinter

我正在尝试构建一个包含wxwidgets(仅用于托盘图标)和Tkinter(用于GUI的其余部分)的应用程序。

import wx
import Tkinter

TRAY_TOOLTIP = 'System Tray Icon'
TRAY_ICON = 'icon.png'

frm = False

class TaskBarIcon(wx.TaskBarIcon):
    def __init__(self):
        super(TaskBarIcon, self).__init__()
        self.set_icon(TRAY_ICON)
        self.Bind(wx.EVT_TASKBAR_LEFT_DOWN, self.on_left_down)

    def set_icon(self, path):
        icon = wx.IconFromBitmap(wx.Bitmap(path))
        self.SetIcon(icon, TRAY_TOOLTIP)

    def on_left_down(self, event):
        createframe()

class Frame(Tkinter.Tk):
    def __init__(self, parent):
        Tkinter.Tk.__init__(self, parent)
        self.parent = parent
        self.protocol('WM_DELETE_WINDOW', self.closewindow)
        self.grid()

    def maximize(self):
        # supposed to try to hide and bring a window back up
        # full code removes the icon from the task bar, so I needed another way to make the window visible again
        self.withdraw()
        self.deiconify()

    def closewindow(self):
        self.destroy()
        global frm
        frm = False             

def createframe():
    global frm
    if isinstance(frm, Tkinter.Tk): # if a window is open, it goes through this if statement
        frm.maximize() # and crashes here.
    else:
        frm = Frame(None)
        frm.title('Frame')
        frm.mainloop()

def main():
    app = wx.App()
    TaskBarIcon()
    app.MainLoop()

if __name__ == '__main__':
    main()

您可以运行此代码并希望看到问题。当您左键单击托盘图标时,会弹出一个窗口,您可以将其关闭并重新打开,但是如果您最小化窗口(或者只是在窗口打开时单击托盘图标),则应用程序崩溃。我认为frm.maximize()是问题所在,因为我可以毫不费力地从班级内拨打self.maximize(),但我无法找到解决方案。

当我尝试从frm.destroy()课程TaskBarIcon时(frm.quit()工作正常)我遇到了同样的问题,所以也许这是一个提示?

1 个答案:

答案 0 :(得分:1)

您无法在同一程序中组合使用wxpython和tkinter。