2013-03-03 430 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毫秒后触发一次事件或者定期触发事件。如果绑定了定时器事件的事件处理程序,那么当定时器到期时,该处理程序将被调用。