【问题标题】:Tkinter Canvas is not showingTkinter 画布未显示
【发布时间】:2019-01-15 19:06:09
【问题描述】:

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

【问题讨论】:

标签: python canvas tkinter countdown


【解决方案1】:

主要问题是您从不调用 mainloop() 方法,这在所有 tkinter 应用程序中都是必需的,因为它是 GUI 功能的组成部分。

此外,您永远不应该在tkinter 应用程序中调用time.sleep(),因为它会干扰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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 2014-12-16
    • 1970-01-01
    • 2021-11-29
    • 2019-06-26
    • 1970-01-01
    • 2017-07-15
    相关资源
    最近更新 更多