PythonでGUIを使って処理を行うと、重い処理だとその処理中にGUIが触れなくなり、困ることがあります。また、処理中にボタンやラベルに「処理中ですよぉ」とか、終わったら「終了しましたよぉ」とか表示させたい場合もあります。この記事では、PythonでGUIの表示を処理中に変更する方法について説明します。
Threadを使う
PythonでThreadを使って処理中の表示を変える方法があります。以下にそのコードの一部を示します。
import threading
import time
from tkinter import ttk
import tkinter
# 5秒タイマー
def timer():
p.start(5) # プログレスバー開始
for i in range(6):
time.sleep(1) # 1秒待機
b["text"] = i # 秒数表示
p.stop() # プログレスバー停止
# ボタンクリック時に実行する関数
def button_clicked():
t = threading.Thread(target=timer) # スレッド立ち上げ
t.start() # スレッド開始
root = tkinter.Tk()
# プログレスバー
p = ttk.Progressbar(root, mode="indeterminate")
p.pack()
# ボタン
b = tkinter.Button(root, width=15, text="start", command=button_clicked)
b.pack()
root.mainloop()
このコードでは、ボタンをクリックするとタイマーが起動し、同時にプログレスバーが動作開始します。5秒後、タイマーとプログレスバーが同時に停止します。
まとめ
- PythonのGUIコードにて、重たい処理を走らせている最中に、GUIのなにがしか表示を替える手段として、Threadを使ってみました。これにより、重たい処理をしている間に表示(今回はボタンの文字列)が変わり、終わると戻るというシンプルな動きをさせることができるようになりました。