59360


tkinterを使って1秒毎に数値をprintするプログラムを作っています。  
Web上に、以下のようなコードがありました。

**・GUItest1.py**

[code]

    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()
    
[/code]

上記のコードを実行すると、GUIが立ち上がり  
startボタンを押すと数値がprintされ、stopボタンを押すとprintが止まります。  
また、再度startボタンを押すと数値のprintが再開されます。

私は、これと同様のことをクラスを使って実装しようとしました。  
書いたコードは以下の通りです。

**・GUItest2.py**

[code]

    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()
    
[/code]

私の書き直したコード(GUItest2.py)でも、GUIが立ち上がり  
startボタンを押すと数値がprintされ、stopボタンを押すと停止します。  
しかし、再度startボタンを押すと、printが再開されません。

私の書いたコードだと、何がおかしいのでしょうか？


CC BY-SA 4.0
2019-09-30T09:12:38.170
59358
2019-09-30T10:18:18.373
34471
question
python
PythonのGUIのスレッド化とクラスについて


`def start(self):`のところの`stop_flag=False`の前に`self.`を付け忘れているためでしょう。


CC BY-SA 4.0
2019-09-30T10:18:18.373
59360
2019-09-30T10:18:18.373
26370
59358
answer