使用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
相关产品推荐
相关产品推荐

