Tkinter画布未显示

时间:2019-01-15 19:06:09

标签: python canvas tkinter countdown

所以我试图使用tkinter在python中进行倒数计时,但是不知何故画布窗口没有显示...我真的不知道为什么,有人可以帮助我吗?

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 :(得分:1)

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

此外,永远不要在time.sleep()应用程序中调用tkinter,因为它会干扰mainloop(),并会导致程序“挂起”。

要克服这些限制,可以使用所有小部件都具有的通用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()