2017-05-20 12 views
1

tkinterを使って、afterメソッドを使用して関数を定期的に実行させるにはどうすればよいですか?afterメソッドを使用してコールバックを定期的に実行する方法

def speak(): 
    print("Hello, world!") 

がどのように私はspeak機能毎秒を呼び出すためにafterメソッドを使用することができます。

は例えば、私は唯一のコンソールで何かを印刷しspeak機能を持っていますか?

+2

この質問は、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) –

+0

この質問は何度も尋ねられています。新しい質問を作成するのではなく、既存の回答のうちの1つを編集して正規のものにするのはいかがですか? –

+0

@BryanOakleyそうですね、私はそうしたかったのですが、質問は正式ではなく、一般的に正確な問題に関連していました。だから、私は簡単な質問を書くことにしました。 –

答えて

2

注:次のコードは、Python 3.5で作成され、テストされています。たとえば、superを呼び出すときに、マイナーな変更が必要になることがあります。次のように

documentationWidget.after方法を記載している:

が所定の時間の後に呼び出されるアラームコールバックを登録

(delay_ms、コールバック=なし、*引数)の後。 after方法は、主に一定の遅延後に、関数呼び出しをスケジュールするために使用される関数

スケジューリング


。例えば、コードのスケジュール秒1の後に関数の呼び出し、次の関数は、定期的に実行するためには、定期的に

機能の実行を作る

import tkinter as tk 

def speak(): 
    print("Hello world!") 

root = tk.Tk() 
root.after(1000, speak) 

# Output 
Hello world! 

、人はそれを作ることができます自分の体の終わりに自分自身を呼んでください。ただし、afterWidgetクラスのメソッドなので、ウィジェットが必要です。したがって、一般的には、スケジュールされた関数を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`は現在のスレッドを一時停止させるからです。ほとんどの時間がメインスレッドです。たとえば、ウィジェットのリフレッシュを停止すると、プログラムが応答を停止します。
+0

あなたの最初の答えはあまり正式ではありません。あなたはラムダを使用しています。ラムダは不要で、誤解を招くおそれがあります。初心者はその最初の例を聞いて、それがあなたが「後」を使うべきだと思うかもしれません。 –

+0

@BryanOakleyフェアポイント。 Tkinterに精通している[SO Pythonのチャットルーム](http://chat.stackoverflow.com/rooms/6/python)の私たちのうちのいくつかは、このQ + Aのペアを数日後に見て、提供したいと考えていますそれを傷つけるための建設的な批判。 –

+0

@BryanOakleyあなたが正しいです、私はその点を編集しました。 PM 2Ringが言ったように、この投稿を自由に編集することができます、私はこれが役に立ちます:) –

関連する問題