I\'m currently learning the Tkinter GUI programming. And I\'m stuck in somewhere in multi threading concept. Even though this topic is discussed several times here, I couldn
Pythonista's answer is excellent. But I'd like to touch upon some additional points.
after
. Or you could to them in another process with multiprocessing
. But then you'd still need to check periodically (with after
again) if they have finished.The following points stem from the fact that doing multithreading right is hard.
CPython (the most used Python implementation) has what is called a Global Interpreter Lock. This ensures that only one thread at a time can be executing Python bytecode. When other threads are busy executing Python bytecode, the thread running the GUI is doing nothing. So multithreading is not a certain solution to the problem of an unresponsive GUI.
a lot of GUI toolkits are not thread-safe, and tkinter is not an exception. This means that you should only make tkinter calls from the thread that's running the (In Python 3.x, mainloop
.tkinter
has been made thread safe.)
You don't need threading for something this simple.
The GUI is freezing because you're putting a time.sleep
inside the function which is blocking the main thread until it's finished.
Simply use Tk's built in after
method. Change your function to.
def countNum(self, num=0):
if num < 10:
print num
root.after(2000, lambda: self.countNum(num + 1))
else:
print "Stopping after call"
The after
method takes the following arguments:
after(delay_ms, callback, arguments)
The time is in milliseconds, and 1000 ms = 1 second. So, we pass 2,000 ms for a 2 second delay.