田舎社会人のいろいろ学習記

Python、英語、その他いろいろ

【tkinter】タイミングを指定して関数を実行する方法【Python】

f:id:vigilantPotato:20210729020149p:plain
画面を定期的にアップデートするなど、指定した時間経過後に自動的に関数を実行したい場面で便利な、afterメソッドについて使い方を整理した。


【スポンサーリンク】


一定時間経過後に関数を実行

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関数が実行されてラベルのテキストが変更される。

f:id:vigilantPotato:20210729015924p:plain f:id:vigilantPotato:20210729015941p:plain

[↑ 目次へ]


【スポンサーリンク】


定期的に関数を実行

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間隔でカウントアップを行う。

f:id:vigilantPotato:20210729020012p:plain f:id:vigilantPotato:20210729020022p:plain

[↑ 目次へ]


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ループを抜けた後に最終的な値が表示される。

[↑ 目次へ]


【スポンサーリンク】