Tkinter Canvas 没有显示

Tkinter Canvas is not showing

所以我尝试使用 tkinter 在 python 中进行倒计时,但不知何故 canvas windows 没有显示...我真的不知道为什么,可以有人帮帮我吗?

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()

主要问题是您永远不会调用 mainloop() 方法,这在所有 tkinter 应用程序中都是必需的,因为它是 GUI 功能的基础。

此外,您永远不应在 tkinter 应用程序中调用 time.sleep(),因为它会干扰 mainloop() 并会导致您的程序 "hang".

要克服这些限制,您可以使用所有小部件都具有的通用 after() 方法。这里有一些关于它的 documentation

请注意 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()