首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >wxPython:卡住.MainLoop()

wxPython:卡住.MainLoop()
EN

Stack Overflow用户
提问于 2013-03-03 19:47:02
回答 2查看 1.1K关注 0票数 0

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

我有一个应该每两分钟运行一次的函数。此函数位于一个简单的wxPython系统托盘程序中。问题是我不知道如何运行这个函数,因为wxPython从不离开.MainLoop()。我应该把这个函数放在哪里?

下面是代码:(我省略了函数和import,因为它们不相关。)

代码语言:javascript
复制
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()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-03 20:15:22

我从未使用过wxPython,但您可以使用Python标准库的线程模块。

一个最小的例子:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2013-03-04 05:39:18

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15185311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档