前提・実現したいこと
Tkinter でメイン処理呼び出すGUIを作成し、GUIを止めないために、
threadingでメイン処理を呼び出しています。
①しかしながら外部関数をそのままthreadingのターゲットにしてしまうと、
重たい処理やsleep処理が入った途端に
tkのメインループが止まってしまうのか、GUIがフリーズします。
これではGUIが操作できないので、困ります。
②一方でtarget関数をlambda式で呼び出すとGUIがフリーズせず、
意図した挙動を示します。
この違いについてご教示くださいますと幸いです。
特に、なぜ①で実装するとうまくいかないのかを教えていただけますと幸いです。
Python3
1 2import tkinter as tk 3import threading 4import time 5 6def test_func(): 7 time.sleep(5) 8 print('done') 9 10class Test_App(tk.Frame): 11 def __init__(self,master): 12 super().__init__(master) 13 self.pack() 14 master.geometry("750x390-50-90") 15 16 self.button1 = tk.Button(master,text = 'button',command = self.button1_clicked) 17 self.button1.place(x=0,y=0) 18 19 def button1_clicked(self): 20 test_thread = threading.Thread(target=test_func(),args=()) 21 test_thread.start() 22 23if __name__ == "__main__": 24 app = Test_App(tk.Tk()) 25 app.mainloop()
このようにするとうまくいく
Python
1test_thread = threading.Thread(target=lambda:test_func(),args=()) 2test_thread.start()
補足情報(FW/ツールのバージョンなど)
Python3.8.5です
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/05/23 11:41