所以我试图使用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()
答案 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()