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()
2 个回答
1
wxPython和大多数图形用户界面(GUI)框架一样,使用的是事件驱动的编程模型。这意味着你的程序中的某些部分会在用户的操作(比如按键、选择菜单等)、系统的动作或者其他程序的影响下被执行。其余时间,程序会在主循环中等待这些事件的发生。
对于你提到的情况,可以使用wx.Timer类,它可以在N毫秒后触发一次事件,或者定期触发。如果你为定时器事件绑定了一个事件处理函数,那么当定时器到期时,这个处理函数就会被调用。
0
我之前没用过wxPython,不过你可以使用Python自带的线程模块。
下面是一个简单的例子:
import threading
def work():
threading.Timer(0.25, work).start()
print "stackoverflow"
work()
你可以看看这个讨论(例子来自那里):实时每N秒在线程中定期执行函数