Причина, по которой вы видите, что код выполняет sleep()
, а затем печатает True
до открытия окон tkinter, вызвана тем, как mainloop()
работает в tkinter.
sleep()
полезна в pythonоднако из-за однопоточной природы tkinter все, что может sleep()
, может блокировать основной цикл, пока он не завершит спящий режим. У Tkinter есть собственный метод для решения этой проблемы, который называется after()
, и он вам здесь не нужен, но он очень полезен для определения времени в tkinter.
Tkinter обновляет информацию в основной лупе, и у вас естьsleep()
команда, которая появляется перед вашей основной группой, а также команда печати перед основной областью. Обе эти вещи должны завершить выполнение до того, как основной цикл будет достигнут в первый раз, таким образом, не позволяя tkinter запускаться до тех пор, пока они не будут завершены.
То, что вы хотите сделать, это поместить этот оператор print в вашу функцию. А также несколько других улучшений качества жизни.
См. Этот пример:
import tkinter as tk
top = tk.Tk()
x = True
def hello_call_back():
global x
x = False
if not x:
print('Hello')
tk.Button(top, text="Hello", command=hello_call_back).pack()
top.mainloop()
Однако в этом случае я думаю, что самая простая форма кода должна выглядеть следующим образом:
import tkinter as tk
top = tk.Tk()
def hello_call_back():
print('Hello')
tk.Button(top, text="Hello", command=hello_call_back).pack()
top.mainloop()
Поскольку текущее использование x
избыточно для цели.