zephi
zephi

Reputation: 418

Calling an instance method from outside the class results in a crash

I'm trying to build an app that incorporates wxwidgets (just for the tray icon) and Tkinter (for the rest of the 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()

You can run this code and hopefully see the problem. When you left-click the tray icon, a window pops up, you can close it and reopen it, however if you minimize the window (or just click the tray icon while the window is open), the app crashes. I suppose frm.maximize() is the problem, since I can call self.maximize() from within the class without trouble, but I was not able to find a solution.

I had the same problem when I was trying to do frm.destroy() from the TaskBarIcon class (while frm.quit() worked just fine), so maybe that's a hint?

Upvotes: 1

Views: 116

Answers (1)

Bryan Oakley
Bryan Oakley

Reputation: 385970

You can't combine wxpython and tkinter in the same program.

Upvotes: 1

Related Questions