PythonのGUIのスレッド化とクラスについて
tkinterを使って1秒毎に数値をprintするプログラムを作っています。
Web上に、以下のようなコードがありました。
・GUItest1.py
import tkinter as tk
import threading
import time
def time_count():
global frame
global stop_flag
while not stop_flag:
print(frame)
frame=frame+1
time.sleep(1)
def start():
global stop_flag
global thread
# スレッドが無いなら生成してstart()する
if not thread:
thread = threading.Thread(target=time_count)
stop_flag=False
thread.start()
def stop():
global stop_flag
global thread
# スレッドがある場合停止してjoin()する
if thread:
stop_flag=True
thread.join()
thread=None
frame=1
stop_flag=False
thread=None
root=tk.Tk()
Button001=tk.Button(root,text="Start",command=start)
Button001.pack()
Button002=tk.Button(root,text="Stop",command=stop)
Button002.pack()
root.mainloop()
# 終了時にスレッドを停止する処理
stop_flag=True
thread.join()
上記のコードを実行すると、GUIが立ち上がり
startボタンを押すと数値がprintされ、stopボタンを押すとprintが止まります。
また、再度startボタンを押すと数値のprintが再開されます。
私は、これと同様のことをクラスを使って実装しようとしました。
書いたコードは以下の通りです。
・GUItest2.py
import tkinter as tk
import threading
import time
class threadingGUI():
def __init__(self):
self.frame=1
self.stop_flag=False
self.thread=None
def time_count(self):
while not self.stop_flag:
print(self.frame)
self.frame=self.frame+1
time.sleep(1)
def start(self):
if not self.thread:
self.thread = threading.Thread(target=self.time_count)
stop_flag=False
self.thread.start()
def stop(self):
if self.thread:
self.stop_flag=True
self.thread.join()
self.thread=None
def GUI_start(self):
root=tk.Tk()
Button001=tk.Button(root,text="Start",command=self.start)
Button001.pack()
Button002=tk.Button(root,text="Stop",command=self.stop)
Button002.pack()
root.mainloop()
self.stop_flag=True
self.thread.join()
t = threadingGUI()
t.GUI_start()
私の書き直したコード(GUItest2.py)でも、GUIが立ち上がり
startボタンを押すと数値がprintされ、stopボタンを押すと停止します。
しかし、再度startボタンを押すと、printが再開されません。
私の書いたコードだと、何がおかしいのでしょうか?