Tkinter中after函数动画失效及窗口显示异常问题求助
问题修复方案
核心问题分析
after函数调用错误:原代码里window.after(10000, drawlines(movestep))是直接执行drawlines函数,而非把函数作为延迟任务传递,导致递归瞬间跑完,没有预期的间隔效果,最终触发栈溢出。- 冗余的
pack()调用:mycanvas.pack()在初始化和drawlines函数里重复执行,完全没必要。 - 缺少递归终止条件:没限制
movestep的上限,导致递归无限执行,最终程序崩溃。 - 颜色冲突:线条颜色设为黑色(
#000000),和窗口背景色一致,可能导致线条难以辨认。
修复后的代码
from tkinter import * # 初始化窗口与画布 window = Tk() window.title("solid show") window.resizable(False, False) window.tk_setPalette(background='#000000') canvas_width = 600 canvas_height = 600 mycanvas = Canvas(window, width=canvas_width, height=canvas_height, bg='#000000') mycanvas.pack() # 绘制线条函数 def drawlines(movestep): # 改用白色线条,避免和黑色背景冲突 mycanvas.create_line(150, movestep, 300, movestep, fill="#ffffff") movestep += 10 # 设置终止条件:当movestep超过450时停止递归 if movestep < 450: # 用lambda包装函数调用,确保after只注册延迟任务 window.after(1000, lambda: drawlines(movestep)) # 初始化参数并绘制椭圆 movestep = 150 mycanvas.create_oval(45, 45, 555, 555, fill='#cccccc') # 启动动画 window.after(1000, lambda: drawlines(movestep)) window.mainloop()
关键修改说明
- 正确使用
after:通过lambda表达式包装函数调用,确保after仅注册延迟执行的任务,而非立即触发函数。 - 移除冗余操作:画布仅在初始化时调用一次
pack()。 - 添加终止逻辑:通过
if movestep < 450判断,线条位置超过450时停止递归,避免无限调用导致栈溢出。 - 调整线条颜色:改为白色(
#ffffff),在黑色背景和灰色椭圆上更清晰可见。
内容的提问来源于stack exchange,提问作者Les O'Leary
相关产品推荐
相关产品推荐

