Основная проблема в том, что вы никогда не вызываете метод mainloop()
, который необходим во всех приложениях tkinter
, потому что именно он делает функцию GUI.
Кроме того, вы никогда не должны вызывать time.sleep()
в tkinter
приложении, потому что это мешает mainloop()
и приведет к зависанию вашей программы.
Чтобы преодолеть эти ограничения, вы можете использовать универсальный метод after()
, который есть у всех виджетов. Вот немного документации об этом.
Обратите внимание, что функция c()
больше не содержит петлю while
. Вместо этого он сам вызывает after()
и передает себя ему как функцию, вызываемую после задержки - это поддерживает работу до тех пор, пока счетчик не достигнет нуля.
Чтобы сделать вещи более эффективными, я также изменил ваш код, чтобы он создавал только один текстовый объект Canvas
, а затем обновлял его. Это предотвращает накопление набора Canvas
текстовых объектов друг над другом, которые больше не нужны.
import tkinter
canvas = tkinter.Canvas(height=350,width=400,)
canvas.pack()
DELAY = 1000 # milliseconds.
t = 10
text_obj_id = None
def c():
global t
global text_obj_id
if t >= 0:
if t == 0:
canvas.create_text(100, 10, text="YOU LOST!")
else:
t -= 1
if text_obj_id is None: # First time?
text_obj_id = canvas.create_text(50, 50, text=t, font="Aria 25",
fill="red")
else: # Update existing Canvas text object.
canvas.itemconfigure(text_obj_id, text=t)
print(t)
canvas.after(DELAY, c) # call again in 1000 ms.
c() # Starts repeated calling of function.
canvas.mainloop()