0

私は経験豊富なプログラマーではありません。これはおそらく解決するのが簡単な問題です。

2分ごとに実行するはずの関数があります。この関数は、単純な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()
4

2 に答える 2

1

wxPythonは、ほとんどのGUIフレームワークと同様に、イベント駆動型プログラミングモデルを使用します。つまり、プログラムの一部は、ユーザー、システム、またはおそらく他のプログラムから発生した可能性のあるアクション(キーの押下、メニューの選択など)に応答して実行されます。残りの時間はMainLoopにあり、それらのいずれかが発生するのを待っています。

あなたのような状況では、イベントを1回、またはNミリ秒後に定期的にトリガーできるwx.Timerクラスがあります。タイマーイベントのイベントハンドラーをバインドすると、タイマーの期限が切れたときにそのハンドラーが呼び出されます。

于 2013-03-03T21:39:18.253 に答える
0

私はwxPythonを使用したことがありませんが、Pythonの標準ライブラリのスレッドモジュールを使用できます。

最小限の例:

import threading

def work(): 
    threading.Timer(0.25, work).start()
    print "stackoverflow"

work()

このスレッドを見てください(例はそこからです):N秒ごとにリアルタイムで定期的にスレッドで関数を実行します

于 2013-03-03T12:15:21.713 に答える