You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用canvasvg.saveall()保存turtle绘图时遇'_Screen'无'tk'属性错误

解决turtle绘图用canvasvg保存的错误及转PNG/JPEG方案

错误原因

canvasvg.saveall()要求传入tkinter的Canvas对象,你当前传入的是turtle封装的_Screen实例,因此触发'_Screen' object has no attribute 'tk'错误。

修复步骤

1. 传入正确的Canvas对象

通过turtle Screen的getcanvas()方法,可获取到底层的tkinter Canvas实例,将其传给canvasvg.saveall()即可解决报错。

2. 避免覆盖turtle模块名

你的代码中把turtle模块名赋值给了Turtle实例(turtle = turtle.Turtle(...)),会导致后续调用模块方法出错,建议将实例变量名改为t或其他名称。

3. 可选:SVG转PNG/JPEG

canvasvg仅支持生成SVG格式,若需要导出PNG/JPEG,可通过cairosvg库将SVG转成PNG(该库可通过pip直接安装)。

修改后的完整代码

import turtle
import random
import canvasvg
from cairosvg import svg2png  # 可选,用于将SVG转为PNG

root = turtle.Screen()
drawing = 1

def save():
    # 保存为SVG文件
    canvasvg.saveall("spircles.svg", root.getcanvas())
    # 可选:自动将SVG转为PNG
    svg2png(url="spircles.svg", write_to="spircles.png")
    print("已保存spircles.svg和spircles.png")

print("turning angle:")
turningangle = float(input())
print("size:")
forward = float(input())
print("spiral:")
try:
    spiral = float(input())
except:
    spiral = random.random()

# 改用t作为海龟实例名,避免覆盖turtle模块
t = turtle.Turtle(visible=False)
t.speed(0)
t.hideturtle()

print("drawing. spiral:", spiral)
try:
    # 事件绑定移到循环外,避免重复绑定
    root.onkey(save, "s")
    root.listen()
    while drawing == 1:
        t.left(turningangle)
        t.forward(forward)
        turningangle += spiral
        spiral += (spiral / turningangle)
except Exception as e:
    drawing = 0
    print("done. press enter to exit. error:", e)
    input()
    exit()

turtle.mainloop()

额外说明

  • 安装依赖:pip install canvasvg cairosvg(不需要转PNG可仅安装canvasvg)
  • 按s键即可触发保存,默认生成SVG和PNG文件(保留转码代码的情况下)
  • 将事件绑定移到循环外,避免每次循环重复绑定,减少资源消耗

内容的提问来源于stack exchange,提问作者DuckyPolice

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 00:50:20