Python tkinterのmainloopをとwhileなどを使用した場合、
tkinterの仕様からminloopで閉じないととその動作を停止する方法がありませんが
そのためguiのボタンが押せない、文字が変わらない問題があります。
その解決方法を記載しております。
プログラム例
下記のプログラムは動ききませんが
なみないという名前が見つかるまで、無限ループします
その間ボタンは押せませんし、ボタンの文字Stopも変化しません
import tkinter
# ボタンが押された時の処理
def search():
while True:
global text
if text == なみない
break
else:
time.sleep(0.5)
button1 = tk.Button(frame, textvariable=text, command=text,repeatdelay=100)
不具合内容
検索開始ボタンを押すとすべてのボタンが動作しなくなります
windowsすらクローズできません
当然下のstopの文字も処理が終わるまで変化しません
対策方法
スレッドベースの並列処理を使用する。
並列処理とは文字のとおり並列での処理を行う事ができます。
下記イメージ
プログラム例
#threadingをimportします。
import threading
# 文字を変更する関数
def change():
#グローバル変数として登録
global tex
#文字ラベルをstop→stratに変更します
text2.set(‘strat’)
#処理が終わらないと次の処理ができないため間違って押さないようにボタン押せないようにします。
button1[‘state’] = tk.DISABLED
# th2(関数search)を呼び出し
global th2
関数 searchを起動
th2.start()
#searchの関数を動かすためにth1の変数に入れる
th1 = threading.Thread(target=search)
#ラベルの文字変更をするためにchangeの関数を動かすためにth2の変数に入れる
th2 = threading.Thread(target=change)
上記の処理を2種類行う事でstopの文字の変更とsearchを同時に動かす事ができます。
注意事項
searchの処理が終わらないとボタンは押せますが
次の処理ができません、そのためボタンを押すためにはsearch処理を変数などを使って
停止する必要があります。
コメント