【スポンサーリンク】
一定時間経過後に関数を実行
afterメソッドに経過時間と実行する関数を渡すことで、指定した時間経過後に特定の関数を実行させることができる。以下、ボタンをクリックしてから1000ms経過後に、ラベルに+1000ms passedと表示させる例を示す。
import tkinter #一定時間経過後に実行する関数 def change_label_text(): l["text"] = "+1000ms passed" #ボタンクリック時に実行する関数 def update(): l["text"] = "0ms" #1000ms後にchange_label_textを実行 root.after( 1000, change_label_text, ) root = tkinter.Tk() #ラベル l = tkinter.Label( root, text="Label", ) l.pack() #ボタン b = tkinter.Button( root, text="start", command=update, ) b.pack() root.mainloop()
実行するとラベルとボタンが表示され、ボタンをクリックするとupdate関数が実行され、さらに1000ms経過後にchange_label_text関数が実行されてラベルのテキストが変更される。
【スポンサーリンク】
定期的に関数を実行
afterメソッドを利用して、定期的に特定の関数を実行させることができる。以下、ボタンをクリック後、1秒ごとにラベルに経過時間を表示させる例を示す。
import tkinter #一定時間経過後、繰り返し実行する関数 def update(): var.set(var.get()+1) if var.get() < 10: root.after(1000, update) #自分を1000ms後に呼び出し else: var.set(0) root = tkinter.Tk() #経過時間格納用変数 var = tkinter.IntVar(root) #ラベル l = tkinter.Label( root, textvariable=var, ) l.pack() #ボタン b = tkinter.Button( root, text="start", command=update, ) b.pack() root.mainloop()
実行するとラベルとボタンが表示され、ボタンをクリックするとupdate関数を実行する。update関数内でカウントアップを行い、さらにafterメソッドで自分自身(update関数)を1000ms後に実行するように指定しているため、1000ms間隔でカウントアップを行う。
time.sleep関数を使用した場合(動作しない)
一定間隔をあけて処理を実行させるためにループとtime.sleep関数を用いると、画面の更新処理も停止してしまう。以下、例を示す。
import tkinter import time #time.sleepを使用 def update(): while var.get() < 10: var.set(var.get()+1) time.sleep(1) root = tkinter.Tk() #経過時間格納用変数 var = tkinter.IntVar(root) #ラベル l = tkinter.Label( root, textvariable=var, ) l.pack() #ボタン b = tkinter.Button( root, text="start", command=update, ) b.pack() root.mainloop()
こちらの例だと、ボタンをクリックしてもラベルの値は更新されず、10秒経過してwhileループを抜けた後に最終的な値が表示される。
【スポンサーリンク】