0

I've been trying to minimize an application to the tray and I'm having an issue once it returns to the screen.

My Application closes properly as long as I don't minimize, Once I minimize my OnExit() does not execute.

Here is my code;

import wx

class simpleapp_wx(wx.Frame):
    def __init__(self,parent,id,title):
        wx.Frame.__init__(self,parent,id,title, pos = wx.DefaultPosition, size = wx.Size( -1,-1 ))
        self.parent = parent
        self.initialize()

    def initialize(self):
        Main_Frame = wx.BoxSizer( wx.VERTICAL ) # Creates the Main box Sizer Parent
        self.icon = wx.Icon('MainIcon.ico', wx.BITMAP_TYPE_ICO) # This gets an Icon for the application
        self.SetIcon(self.icon)  # This assigns the Icon

        self.Bind(wx.EVT_CLOSE, self.close_window) # This closes the window

        self.tbicon = wx.TaskBarIcon() # This assigns the Icon control that will be used when minimixed to tray
        self.Bind(wx.EVT_ICONIZE, self.OnIconify) # This calls the function that minimizes to tray (Iconize = Minimize)
        self.tbicon.Bind(wx.EVT_TASKBAR_LEFT_DCLICK, self.OnTaskBarActivate) # This is what return the application to the screen. TaskBar Left Double Click

        BottomButtons = wx.StdDialogButtonSizer()
        self.BottomButtonsClose = wx.Button( self, wx.ID_CLOSE, "Close" )
        BottomButtons.AddButton( self.BottomButtonsClose )
        BottomButtons.Realize();

        self.BottomButtonsClose.Bind(wx.EVT_BUTTON, self.close_window) # Button click event handler

        Main_Frame.Add( BottomButtons, -1, wx.EXPAND, 5 )

        self.SetSizerAndFit(Main_Frame) # makes the Parent window size to all the items on screen
        self.Layout()

    def close_window (self, event):
        self.Destroy() # Destroy the box on close
        print "Destroy"

    def OnTaskBarActivate(self, evt): # Return from the Taskbar
        if self.IsIconized():
            print "Return to Front"
            self.Iconize(False) # Hide the icon from the Taskbar
            self.Show() # Show the Main Window
            self.Raise() #Raise the Main Window to the screen
            self.tbicon.RemoveIcon() # Remove the Icon from the Taskbar

    def OnIconify(self, evt):  
        if evt.Iconized():
            print "Minimize to Tray"
            self.Iconize(True) # Show the Icon on the Taskbar
            self.Hide() # Hide the Main Window from the screen
            self.tbicon.SetIcon(self.icon) #Set the Icon on the Taskbar
    ''' ------------------------------------------------------------------------------------------------------------
    Bottom of the Button and Control Definitions;
    -------------------------------------------------------------------------------------------------------------'''

class MyApp(wx.App):
    def OnInit(self):
        frame = simpleapp_wx(None, -1, "Minimize to Tray") # Call/assign the Main Frame
        frame.Show(True) # Show the Frame
        frame.Centre() # Center it on the screen
        return True
    def OnExit(self):
        print "OnExit Destroy0"
        self.Destroy()
        print "OnExit Destroy1"
        return False

app = MyApp(0)
app.MainLoop()

I've only been coding in Python/wxPython for about a month now and this is my first attempt at trying to minimize to the tray. I was happy until my application didn't close properly. I've looked at many different examples in using IsIconize and I fail to see what I am doing wrong.

Thanks for looking.

Vin

4

1 回答 1

0

您需要在销毁框架之前删除 tbicon 对象。我第一次使用它们时也花了一段时间才弄清楚这一点。将以下内容放入您的关闭处理程序中:

self.tbIcon.RemoveIcon()
self.tbIcon.Destroy()
self.Destroy()

您会注意到我删除了该图标,然后也将其销毁。我知道当我用 2.8 做这件事时,我必须把两者都拿回来,但也许 2.9 不再需要 tbicon.Destroy() 了。你必须玩它才能看到。

如果你喜欢,你也可以阅读我关于这个主题的教程:http: //www.blog.pythonlibrary.org/2011/12/13/wxpython-101-creating-taskbar-icons/

于 2013-06-26T13:39:45.077 回答