wxPython: 卡在 .MainLoop() 中

1 投票
2 回答
1295 浏览
提问于 2025-04-17 17:45

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

我有一个函数,应该每两分钟运行一次。这个函数是在一个简单的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秒在线程中定期执行函数

撰写回答