2013-06-26 56 views
0

我一直在尝试最小化应用程序到托盘,并且一旦它返回到屏幕,我遇到问题。最小化到托盘应用程序后未正确关闭

我的应用程序正常关闭,只要我不会最小化,一旦我最小化我的OnExit()不执行。

这是我的代码;

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() 

我只在Python/wxPython的编码,现在约一个月,这是我在试图最小化到托盘第一次尝试。我很高兴,直到我的应用程序没有正常关闭。我在使用IsIconize时看过很多不同的例子,但我没有看到我做错了什么。

感谢您的期待。

Vin

回答

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/

+0

@迈克·德里斯科尔 - 谢谢你,我已经使用.RemoveIcon()试过了,但即使没有想到.Destroy的()。现在工作正常。 – Vinster411

相关问题