You can emulate time.sleep
in tkinter. For this we still need to use the .after
method to run our code alongside the mainloop, but we could add readability to our code with a sleep
function. To add the desired behavior, tkinter provides another underestimated feature, wait_variable
. wait_variable
stops the codeblock till the variable is set and thus can be scheduled with after
.
def tksleep(t):
'emulating time.sleep(seconds)'
ms = int(t*1000)
root = tk._get_default_root('sleep')
var = tk.IntVar(root)
root.after(ms, var.set, 1)
root.wait_variable(var)
Real world examples:
Limitation:
- tkinter does not quit while
tksleep
is used.
- Make sure there is no pending tksleep by exiting the application.
- Using tksleep casually can lead to unintended behavior
UPDATE
TheLizzard worked out something superior to the code above here. Instead of tkwait command he uses the mainloop
and this overcomes the bug of not quitting the process as described above, but still can lead to unintended output, depending on what you expect:
import tkinter as tk
def tksleep(self, time:float) -> None:
"""
Emulating `time.sleep(seconds)`
Created by TheLizzard, inspired by Thingamabobs
"""
self.after(int(time*1000), self.quit)
self.mainloop()
tk.Misc.tksleep = tksleep
# Example
root = tk.Tk()
root.tksleep(2)
tk.Tk()
every time to use thetksleep
method? And doesn't themainloop
of that newtk.Tk()
instance still block the whole execution? If not, why? Doesn't it all use the normal single thread? – Blate