2013-03-03 428 views
0

我不是一個有經驗的程序員。這可能是一個要解決的簡單問題。wxPython:困在.MainLoop()

我有一個應該每兩分鐘運行一次的函數。這個函數在一個簡單的wxPython系統托盤程序中。問題是我不知道如何運行該函數,因爲wxPython永遠不會離開.MainLoop()。我應該在哪裏放置這個功能?

下面是代碼:(我已經離開了功能和導入,因爲它是不相關的。)

TRAY_TOOLTIP = 'System Tray Demo' 
TRAY_ICON = 'star.png' 

def create_menu_item(menu, label, func): 
    item = wx.MenuItem(menu, -1, label) 
    menu.Bind(wx.EVT_MENU, func, id=item.GetId()) 
    menu.AppendItem(item) 
    return item 

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 CreatePopupMenu(self): 
     menu = wx.Menu() 
     create_menu_item(menu, 'Say Hello', self.on_hello) 
     menu.AppendSeparator() 
     create_menu_item(menu, 'Exit', self.on_exit) 
     return menu 
    def set_icon(self, path): 
     icon = wx.IconFromBitmap(wx.Bitmap(path)) 
     self.SetIcon(icon, TRAY_TOOLTIP) 
    def on_left_down(self, event): 
     print 'Tray icon was left-clicked.' 
     MailCheck() 
    def on_hello(self, event): 
     print 'Hello, world!' 
    def on_exit(self, event): 
     wx.CallAfter(self.Destroy) 


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

    #This is my function I want to run 
    #But MainLoop() never ends. Where should I put MainCheck() ? 
    MailCheck()  

if __name__=='__main__': 
    main() 

回答

0

我從來沒有使用wxPython的,但你可以使用Python的標準庫的線程模塊。

的最小例如:

import threading 

def work(): 
    threading.Timer(0.25, work).start() 
    print "stackoverflow" 

work() 

看看這些線(例如是從那裏):Periodically execute function in thread in real time, every N seconds

+0

它的確使用線程模塊工作。非常感謝你! – user2124609 2013-03-03 12:46:30

1

wxPython中,與大多數GUI框架,使用一個事件驅動編程模型。這意味着程序的各個部分是針對可能來自用戶的操作(例如按鍵,菜單選擇等)或者可能來自某個其他程序而運行的。剩下的時間它在MainLoop中等待其中一件事發生。

對於像你這樣的情況,有一個wx.Timer類可以在N毫秒後觸發一次事件或者定期觸發事件。如果綁定了定時器事件的事件處理程序,那麼當定時器到期時,該處理程序將被調用。