Tkinter Canvas не отображается - PullRequest
0 голосов
/ 15 января 2019

Так что я пытался сделать обратный отсчет в python, используя tkinter, но почему-то окна холста не отображаются ... Я не знаю почему, кто-нибудь может мне помочь?

import tkinter
import random
import time
canvas=tkinter.Canvas(height=350,width=400,)
canvas.pack()

t=10

def c():
    global t
    while t>=0:
        if t == 0:
            canvas.create_text(100,10, text="YOU LOST!")


        else:
            time.sleep(1)        
            t-=1
            canvas.create_text(50,50, text=t, font="Aria 25", fill="red")
            print(t)            

c()

1 Ответ

0 голосов
/ 15 января 2019

Основная проблема в том, что вы никогда не вызываете метод 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()
...