3.17 スケジュール(タイマー)処理(after、after_idle、after_cancel)
一定時間の経過後に関数を実行させる機能を持っています。スケージュールまたはタイマー機能とも呼ばれます。Misc クラスの「after」メソッドを用います。下記の書式を用います。詳細はMisc クラスメソッドを参照して下さい。
引数 ms に関数を呼び出す時間(ミリ秒)、func に呼び出す関数のオブジェクト、*arg に関数に渡す引数の値を指定します。このメソッドは関数と実行するまでの時間をシステムに登録すると終了します。関数の実行はシステムが行います。関数を指定しない場合は、このメソッドは指定した時間まで終了しないで待機します。
時間指定ではなく、ウィンドウの「mainloop」メソッドでの全てのイベント処理が終わった後に実行するように関数を指定することができます。。Misc クラスの「after_idle」メソッドを用います。下記の書式を用います。詳細はMisc クラスメソッドを参照して下さい。
引数 func に呼び出す関数のオブジェクト、*arg に関数に渡す引数の値を指定します。このメソッドは「mainloop」メソッドで処理するイベントがなくなると指定した関数を実行するようにシステムに登録します。
「after」または「after_idle」メソッドでシステムに登録した関数の実行を取り消すには Misc クラスの「after_cancel」メソッドを用います。下記の書式を用います。詳細はMisc クラスメソッドを参照して下さい。
引数 id に取り消す「after」または「after_idle」メソッドの識別子を指定します。この識別子は「after」または「after_idle」メソッドの実行時にメソッドから返されます。
次のプログラムはウィンドウにフレームを配置しています。「update」メソッドでイベント処理の終了後、「after」メソッドで 2 秒間待機(スリープ)します。次いで、同じ「after」メソッドで関数「afterfunc」を 3 秒後に実行するようにシステムに登録しています。関数「afterfunc」では「after_idle」メソッドでフレームを削除する「destroy」メソッドを実行しています。それぞれの実行タイミングが分かるように 「sleep」、「before」、「after」の文字列を「print」出力しています。
import tkinter as tk | |
root = tk.Tk() | |
root.geometry('300x200+100+100') | |
frame = tk.Frame(root, bg='red') | |
frame.place(x=50, y=20, width=200, height=160) | |
root.update() | |
print('sleep') | |
frame.after(2000) | |
def afterfunc(s): | |
print(s) | |
frame.after_idle(root.destroy) | |
frame.after(3000, afterfunc, 'after') | |
print('before') | |
root.mainloop() |
プログラムを実行すると、ウィンドウが表示された後、指定時間後に、順に下記の文字列が「print」出力されます。
before
after