Tkinter应用每1秒生成新Canvas而非更新原画布问题求助
Tkinter画布实时更新解决方案
你的代码问题出在每次执行main()都会新建一个Canvas组件并添加到窗口,导致画布不断向下叠加。要实现单画布实时更新,按以下方式修改代码:
修改后的完整代码
from tkinter import * from random import randint root = Tk() root.geometry("250x250") # 只设置一次窗口尺寸 lab = Label(root) lab.pack() # 只初始化一次画布,放在全局作用域 canvas = Canvas(root) canvas.pack(fill=BOTH, expand=1) def main(): y = randint(0, 1000) print(y) x = 250 # 清空画布所有原有内容 canvas.delete("all") # 重新绘制所有图形 canvas.create_line(0, y/2, x, y/2, width=2, fill="#ffffff") canvas.create_rectangle(0, 0, 250, y/2-1, outline="#0000CD", fill="#0000CD") canvas.create_rectangle(0, 250, 250, y/2+1, outline="#734a12", fill="#734a12") # 中间线条 canvas.create_line(100, 145, 150, 145, width=2, fill="#ffffff") canvas.create_line(110, 165, 140, 165, width=2, fill="#ffffff") canvas.create_line(100, 185, 150, 185, width=2, fill="#ffffff") canvas.create_line(110, 205, 140, 205, width=2, fill="#ffffff") canvas.create_line(100, 225, 150, 225, width=2, fill="#ffffff") canvas.create_line(110, 245, 140, 245, width=2, fill="#ffffff") canvas.create_line(100, 105, 150, 105, width=2, fill="#ffffff") canvas.create_line(110, 85, 140, 85, width=2, fill="#ffffff") canvas.create_line(100, 65, 150, 65, width=2, fill="#ffffff") canvas.create_line(110, 45, 140, 45, width=2, fill="#ffffff") canvas.create_line(100, 25, 150, 25, width=2, fill="#ffffff") canvas.create_line(110, 5, 140, 5, width=2, fill="#ffffff") canvas.create_line(90, 125, 170, 125, fill="#ffff00", width=3, dash=(4, 2)) # 调度下一次更新 root.after(1000, main) # 启动定时更新 main() root.mainloop()
关键改动说明
- 单一画布实例:把
canvas = Canvas(root)移到全局初始化部分,整个程序只创建一个画布 - 清空画布:每次更新前用
canvas.delete("all")清除原有所有绘制内容,再重新绘制新图形 - 正确的定时调度:只通过
root.after(1000, main)实现每秒更新,移除原代码中main()内部的递归调用,避免栈溢出问题 - 初始化操作复用:窗口尺寸设置、画布布局等操作只执行一次,无需重复调用

内容的提问来源于stack exchange,提问作者Emin
相关产品推荐
相关产品推荐

