dragov 发表于 2025-7-9 09:16:30

Tkinter 中的时间显示有问题



from tkinter import *
import time
root=Tk()
e=Canvas(root,
         width=436,
         height=591,
         background="khaki")
e.pack()
e.create_line(0,286,436,286,
            fill="royalblue",
            width=24,
            arrow="both",
            arrowshape=(244,344,244))
def gyl():
      d=time.strftime("%T")
      root.after(1000,gyl)
      e.create_text(200,275,
            text=d,
            font="方正流行体简体 44 bold",
            fill="fuchsia")
gyl()
mainloop()

FishC 发表于 2025-7-9 09:17:37

在Tkinter中显示动态时间时,主要问题是每次回调都创建新文本对象导致重叠。以下是修正方案:

问题分析:
1. 每次调用 gyl() 都在画布上新建文本,未清除旧文本
2. 未保存文本对象ID导致无法更新内容
3. 未正确管理定时器循环

修正代码:

from tkinter import *
import time

root = Tk()
e = Canvas(root,
         width=436,
         height=591,
         background="khaki")
e.pack()

# 创建静态图形(只执行一次)
e.create_line(0, 286, 436, 286,
            fill="royalblue",
            width=24,
            arrow="both",
            arrowshape=(244, 344, 244))

# 预先创建文本对象并保存ID
time_text = e.create_text(200, 275,
                        text="",
                        font="方正流行体简体 44 bold",
                        fill="fuchsia")

def update_time():
    # 更新现有文本对象内容
    current_time = time.strftime("%T")
    e.itemconfig(time_text, text=current_time)# 关键修改:更新而非新建
    root.after(1000, update_time)# 每秒触发

update_time()# 启动定时器
mainloop()


关键修改说明:
1. 使用 create_text() 预先创建文本对象并保存返回的ID
2. 在回调函数中使用 itemconfig() 更新现有文本
3. 定时器回调函数保持每秒更新

这样修改后:
√ 时间文本会每秒刷新而不会重叠
√ 减少资源占用(不再创建新对象)
√ 保持原有的图形样式不变

如果字体显示异常,请确认系统是否安装"方正流行体简体",或替换为通用字体如 "Arial 44 bold"。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

某一个“天” 发表于 2025-7-9 09:35:56

用Label 动态显示更好

ydwb 发表于 2025-7-9 14:32:44

from tkinter import *
import time
root=Tk()
e=Canvas(root,
         width=436,
         height=591,
         background="khaki")
e.pack()
e.create_line(0,286,436,286,
            fill="royalblue",
            width=24,
            arrow="both",
            arrowshape=(244,344,244))
d = time.strftime("%T")
text_id = e.create_text(200,275,
      text=d,
      font="方正流行体简体 44 bold",
      fill="fuchsia")
def gyl():
    d = time.strftime("%T")
    e.itemconfig(text_id, text=d)
    root.after(1000, gyl)
gyl()
mainloop()

gpa5031 发表于 2025-7-9 14:38:40

看不懂,咋办
页: [1]
查看完整版本: Tkinter 中的时间显示有问题