tkinterを使って、after
メソッドを使用して関数を定期的に実行させるにはどうすればよいですか?afterメソッドを使用してコールバックを定期的に実行する方法
def speak():
print("Hello, world!")
がどのように私はspeak
機能毎秒を呼び出すためにafter
メソッドを使用することができます。
は例えば、私は唯一のコンソールで何かを印刷しspeak
機能を持っていますか?
tkinterを使って、after
メソッドを使用して関数を定期的に実行させるにはどうすればよいですか?afterメソッドを使用してコールバックを定期的に実行する方法
def speak():
print("Hello, world!")
がどのように私はspeak
機能毎秒を呼び出すためにafter
メソッドを使用することができます。
は例えば、私は唯一のコンソールで何かを印刷しspeak
機能を持っていますか?
注:次のコードは、Python 3.5で作成され、テストされています。たとえば、super
を呼び出すときに、マイナーな変更が必要になることがあります。次のように
documentationはWidget.after
方法を記載している:
が所定の時間の後に呼び出されるアラームコールバックを登録
(delay_ms、コールバック=なし、*引数)の後。
after
方法は、主に一定の遅延後に、関数呼び出しをスケジュールするために使用される関数スケジューリング
。例えば、コードのスケジュール秒1の後に関数の呼び出し、次の関数は、定期的に実行するためには、定期的に
機能の実行を作る
import tkinter as tk
def speak():
print("Hello world!")
root = tk.Tk()
root.after(1000, speak)
# Output
Hello world!
、人はそれを作ることができます自分の体の終わりに自分自身を呼んでください。ただし、after
はWidget
クラスのメソッドなので、ウィジェットが必要です。したがって、一般的には、スケジュールされた関数をWidget
のクラス内に配置することをお勧めします。
次のコードは、"Hello world!"
を1秒おきにコンソールに表示します。
import tkinter as tk
class Foo(tk.Tk):
def periodically_speak(self):
print("Hello world!")
self.after(2000, self.periodically_speak)
foo = Foo()
foo.periodically_speak()
使用してパラメータ
一つは、定期的に実行されるメソッドにパラメータを渡すこともできます。この目的のために、after
メソッドは、コールバックの後のすべてのパラメータを、コールバックに渡すパラメータとしてアンパックします。たとえば、root.after(1000, foo, a, b, c)
はfoo(a, b, c)
へのコールをスケジュールします。次の例は、この機能を使用して関数の動作を決定する方法を示しています。
import tkinter as tk
class Foo(tk.Tk):
def periodically_speak(self, text):
print(text)
self.after(2000, self.periodically_speak, text)
foo = Foo()
foo.periodically_speak("Good night world!")
after
メソッド呼び出しをキャンセルする呼び出しのIDに対応する文字列を返します。スケジューリングされたコールをキャンセルするには、after_cancel
メソッドに渡すことができます。
次の例では、毎秒"Hello world!"
の印刷が開始されますが、ボタンを押すと停止します。
import tkinter as tk
class Foo(tk.Tk):
def __init__(self):
super().__init__()
self.callId = None
self.button = tk.Button(self, text="Stop", command=self.stop)
self.button.pack()
def periodically_speak(self):
print("Hello world!")
self.callId = self.after(2000, self.periodically_speak)
def stop(self):
if self.callId is not None:
self.after_cancel(self.callId)
foo = Foo()
foo.periodically_speak()
サイド
次の点を留意すべきであると指摘しています。
after
メソッドでは、指定された遅延の後にコールバックが*正確に*呼び出されることは保証されません。したがって、精度が必要な場合はafter
を使用しないでください。time.sleep
を使用するのが魅力的かもしれません。これは、GUIで作業するときは避けなければなりません。なぜなら、 `sleep`は現在のスレッドを一時停止させるからです。ほとんどの時間がメインスレッドです。たとえば、ウィジェットのリフレッシュを停止すると、プログラムが応答を停止します。あなたの最初の答えはあまり正式ではありません。あなたはラムダを使用しています。ラムダは不要で、誤解を招くおそれがあります。初心者はその最初の例を聞いて、それがあなたが「後」を使うべきだと思うかもしれません。 –
@BryanOakleyフェアポイント。 Tkinterに精通している[SO Pythonのチャットルーム](http://chat.stackoverflow.com/rooms/6/python)の私たちのうちのいくつかは、このQ + Aのペアを数日後に見て、提供したいと考えていますそれを傷つけるための建設的な批判。 –
@BryanOakleyあなたが正しいです、私はその点を編集しました。 PM 2Ringが言ったように、この投稿を自由に編集することができます、私はこれが役に立ちます:) –
この質問は、tkinterの 'after'メソッドに関する質問に対して正式になることを意図しています。それに付随する以下の答えを確認してください。そのトピックに関連する難解な質問の例:[Tkinter after()メソッドの使い方?](http://stackoverflow.com/questions/37748729/how-to-use-tkinter-after-method)、[tkinter :メソッドの後に使用する方法](http://stackoverflow.com/questions/25753632/tkinter-how-to-use-after-method) –
この質問は何度も尋ねられています。新しい質問を作成するのではなく、既存の回答のうちの1つを編集して正規のものにするのはいかがですか? –
@BryanOakleyそうですね、私はそうしたかったのですが、質問は正式ではなく、一般的に正確な問題に関連していました。だから、私は簡単な質問を書くことにしました。 –