wxPython:陷入.MainLoop()

时间:2013-03-03 11:47:02

标签: python wxpython

我不是一位经验丰富的程序员。这可能是一个需要解决的简单问题。

我有一个应该每两分钟运行一次的功能。此功能位于一个简单的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 个答案:

答案 0 :(得分:1)

与大多数GUI框架一样,wxPython使用事件驱动的编程模型。这意味着程序的某些位是为了响应可能源自用户的操作(例如按键,菜单选择等)系统或可能来自某些其他程序而运行的。剩下的时间它在MainLoop中等待其中一件事发生。

对于像你这样的情况,有一个wx.Timer类可以触发一次事件,也可能在N毫秒后定期触发事件。如果为timer事件绑定一个事件处理程序,那么当计时器到期时将调用该处理程序。

答案 1 :(得分: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