2017-09-04 11 views
1

私はpythonで新しいです。私はPython 2.7を使用しています。私は50秒ごとに私に通知するメッセージボックスを持っています。私はOKアプリケーションのフリーズを押したときにPythonの定期的なメッセージボックス

import sys 
import time 
import threading 

if sys.version_info < (3,0): 
     import Tkinter as tkinter 
     import tkMessageBox as mbox 
else: 
     import tkinter 
     import tkinter.messagebox as mbox 

window = tkinter.Tk() 
window.wm_withdraw() 

def loop(): 
    threading.Timer(20.0, loop).start() 
    mbox.showinfo('my app',time.ctime()) 

loop() 

しかし:私はこれを書い 。私が間違っていることは何ですか?

+1

を参照してください。 – campovski

+0

[afterメソッドを使用して定期的に電話をかけるにはどうすればいいですか?](https://stackoverflow.com/questions/44085554/how-メソッドを使用して定期的に呼び出すメソッド) –

答えて

2

window.mainloop()に電話していません。 このメソッドはイベントを処理するウィジェットのメインループをトリガーし、ウィジェットとその子とのやりとりを許可します。

さらに、他のタイマーではなくafterウィジェットメソッドを使用する必要があります。 このメソッドを使用すると、メソッドへの呼び出しをスケジュールできます。 afterメソッドの詳細については、this postをご覧ください。

次のコードは、afterメソッドを使用してloop関数を実装し、window.mainloop()を呼び出してメインループを実行します。 loop機能があなたのwindowされることを、パラメータとしてウィジェットをとること

def loop(root): 
    mbox.showinfo('my app',time.ctime()) 
    root.after(50000, lambda: loop(root)) 

window = tkinter.Tk() 
window.wm_withdraw() 

loop(window) 
window.mainloop() 

注意。 afterメソッドをウィジェットで呼び出す必要があるため、これが必要です。

さらに、afterメソッドはコールバックを2番目のパラメータとして受け取り、lambda関数として渡す方が簡単です。 root.after(50000, f)fと定義した場合、後者はdef f(): return loop(root)で定義されています。

+0

がこの回答を承認しました。あなたは私が "threading.Timerとメソッドの後に"参照できる場所を教えてください。 –

+0

@VladimirYanakiev 'threading.Timer'に対して明白な理由があるかどうかはわかりませんが、' tkinter'はスケジューリングを処理する方法を提供しますそれは一様性のために使用されるべきです。使用するモジュールが少なくなればなるほど、機能全体にわたってより多くの恒常性と互換性が期待できます。 –

関連する問題