前提・実現したいこと
GUIを「停止」ボタンを押さずに右上の×で閉じると、ループが動作し続けてしまうので、
×を押すと停止するようにさせたい。
また、スレッドが並列で立ち上がっているからなのか、何回か実行を繰り返していると、
下記エラーが発生しカーネルが停止してしまうので対策を立てたい。
Tcl_AsyncDelete: async handler deleted by the wrong thread
該当のソースコード
python
1# -*- coding: utf-8 -*- 2import tkinter as tk 3import threading 4 5class MainWin(tk.Frame): 6 def __init__(self,master): 7 super().__init__(master) 8 self.grid() 9 self.master.geometry("100x50") 10 self.master.title("MainWindow") 11 self.create_widgets() 12 self._resetbutton() 13 14 def create_widgets(self): 15 # 実行ボタンの作成 16 self.button_run = tk.Button(self, text="実行", command=self.mainstart) 17 self.button_run.grid(row=0, column=0) 18 # 停止ボタンの作成 19 self.button_stop = tk.Button(self, text="停止", command=self._resetbutton) 20 self.button_stop.grid(row=0, column=1) 21 22 def _resetbutton(self): 23 self.running = False 24 self.button_run.config(text="実行", command=self.startthread,state=tk.NORMAL) 25 26 def startthread(self): 27 self.running = True 28 newthread = threading.Thread(target=self.mainstart) 29 newthread.start() 30 self.button_run.config(text="実行", state=tk.DISABLED) 31 self.button_stop.config(text="停止", command=self._resetbutton) 32 33 def mainstart(self): 34 while self.running: 35 print("start") 36 print("stop") 37 38def main(): 39 root = tk.Tk() 40 app = MainWin(master=root) 41 app.mainloop() 42 43if __name__ == "__main__": 44 main()
補足情報(FW/ツールのバージョンなど)
Python 3.8.3
Spyder 4.1.4
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/04/10 02:51
2021/04/10 03:22
2021/04/10 04:17 編集
2021/04/10 11:31
2021/04/10 13:01
2021/04/10 14:25