Turtle报错:'RawTurtle'对象无'delay'属性,如何实现延迟?
解决RawTurtle调用delay()方法出现AttributeError的问题
核心结论
不能直接给RawTurtle对象调用.delay()方法,因为delay()是TurtleScreen(或Screen)对象的方法,而非RawTurtle实例的方法。
问题原因
你用turtle.RawTurtle(canvas)创建的海龟对象,是绑定到自定义Tkinter Canvas的轻量级海龟实例,它本身没有控制延迟的delay()方法,延迟设置需要通过它所属的屏幕对象来操作。
解决方案
- 通过RawTurtle对象的
.getscreen()方法获取对应的TurtleScreen实例 - 调用该屏幕实例的
.delay()方法设置延迟(单位为毫秒) - 若需要在步骤间暂停并同步更新界面,也可以结合
time.sleep()和root.update()使用
修正后的代码
import turtle import time from customtkinter import * from tkinter import Canvas, ttk, messagebox root = CTk() root.geometry('1080x680') root.title('Tecnologia') root.set_appearance_mode('dark') canvas = Canvas(root, width=1080, height=480) canvas.grid(row=0, column=0) t = turtle.RawTurtle(canvas) # 获取对应的屏幕对象 screen = t.getscreen() def tricmd(): t.home() t.speed(1) t.forward(150) t.left(120) steps.configure(text='第一步:绘制第一条边,左转120度') # 使用屏幕对象设置延迟 screen.delay(500) # 单位毫秒,这里设为500ms示例 t.forward(150) t.left(120) steps.configure(text='第二步:绘制第二条边,再次左转120度') screen.delay(500) t.forward(150) t.left(120) steps.configure(text='第三步:绘制第三条边,回到初始方向,三角形完成') def squarecmd(): t.home() t.speed(1) t.forward(150) t.left(90) steps.configure(text='正方形绘制中:第一条边完成,左转90度') def pentacmd(): t.home() t.speed(1) t.forward(150) t.left(72) # 正五边形每次左转应为72度,原代码45度错误,这里顺便修正 steps.configure(text='五边形绘制中:第一条边完成,左转72度') # 调整标签位置避免和按钮重叠 steps = CTkLabel(root, text='这里将讲解图形绘制步骤', width=300, height=30) steps.grid(row=1, column=0, columnspan=2, pady=10) triangolo = CTkButton(root, width=100, height=35, text='三角形', command=tricmd) triangolo.grid(row=2, column=0, pady=10) quadrato = CTkButton(root, width=100, height=35, text='正方形', command=squarecmd) quadrato.grid(row=3, column=0, pady=10) pentagono = CTkButton(root, width=100, height=35, text='五边形', command=pentacmd) pentagono.grid(row=4, column=0, pady=10) def quit_app(): root.destroy() quitb = CTkButton(root, width=100, height=35, text='退出', command=quit_app) quitb.grid(row=2, column=1, pady=30) root.mainloop()
额外说明
screen.delay(ms)设置的是海龟绘制每个动作后的延迟时间,数值越大,绘图越慢- 如果你需要在步骤间完全暂停(比如等待用户阅读讲解),可以用
time.sleep(2)(暂停2秒),但要在sleep前调用root.update()确保界面更新完成 - 顺便修正了正五边形左转角度的错误(正五边形内角对应外角为72度,原代码45度会导致图形不正确)
内容的提问来源于stack exchange,提问作者guanciottaman
相关产品推荐
相关产品推荐

