dm76
dm76

Reputation: 4240

Stopping a python thread from a tkinter gui

I'm trying to create a simple Python GUI (with Tkinter) with start button, running a while loop in a thread, and a stop button to stop the while loop.

I'm having issue with the stop button, which doesn't stop anything and frozen GUI once the start button is clicked.

See code below:

import threading
import Tkinter

class MyJob(threading.Thread):

    def __init__(self):
        super(MyJob, self).__init__()
        self._stop = threading.Event()

    def stop(self):
        self._stop.set()    

    def run(self):
        while not self._stop.isSet():
            print "-"

if __name__ == "__main__":

    top = Tkinter.Tk()

    myJob = MyJob()

    def startCallBack():        
        myJob.run()

    start_button = Tkinter.Button(top,text="start", command=startCallBack)
    start_button.pack()

    def stopCallBack():
        myJob.stop()

    stop_button = Tkinter.Button(top,text="stop", command=stopCallBack)
    stop_button.pack()

    top.mainloop()

Any idea how to solve this? I'm sure this is trivial and must have be done thousands of times but I cannot find a solution myself.

Thanks David

Upvotes: 1

Views: 1625

Answers (1)

falsetru
falsetru

Reputation: 368954

The code is calling run method directly. It will call the method in the main thread. To run it in a separated thread you should use threading.Thread.start method.

def startCallBack():        
    myJob.start()

Upvotes: 2

Related Questions