上一篇文章:
svg助你画turtle画~ https://blog.csdn.net/Elanx4/article/details/137694061
我完成了代码自动输出的版本,这样svg就能快速转化为python,turtle代码了。
直接上代码:
import turtle
import xml.etree.ElementTree as ET
print('自动输出svg转python_turtle脚本(©Elan_x)\n'
'import turtle')
def draw_svg(svg_file):
# 创建turtle画布
screen = turtle.Screen()
screen.setup(800, 600)
screen.bgcolor("white")
# 创建turtle对象
t = turtle.Turtle()
t.speed(0) # 设置速度为最快,如果想要慢慢欣赏可以调节速度
print('''
screen = turtle.Screen()
screen.setup(800, 600)
screen.bgcolor("white")
t = turtle.Turtle()
t.speed(0)
''')
# 解析SVG文件
tree = ET.parse(svg_file)
root = tree.getroot()
# 绘制SVG元素
for element in root.iter():
tag = element.tag.split('}')[-1]
if tag == 'circle':
draw_circle(t, element.attrib)
elif tag == 'rect':
draw_rect(t, element.attrib)
elif tag == 'line':
draw_line(t, element.attrib)
# 可以继续添加其他元素的绘制函数
# 隐藏turtle并显示绘制结果
t.hideturtle()
turtle.done()
print('''
t.hideturtle()
turtle.done()
''')
def draw_circle(t, attribs):
cx = 0 - (float(attribs['cx']) - 400)
cy = 0 - (float(attribs['cy']) - 300)
r = float(attribs['r'])
t.penup()
t.goto(cx, cy)
t.pendown()
t.circle(r)
print(f'''
t.penup()
t.goto({cx}, {cy})
t.pendown()
t.circle({r})
''')
def draw_rect(t, attribs):
x = float(attribs['x']) - 400
y = 0 - (float(attribs['y']) - 300)
width = float(attribs['width'])
height = float(attribs['height'])
t.penup()
t.goto(x, y)
t.pendown()
for _ in range(2):
t.forward(width)
t.right(90)
t.forward(height)
t.right(90)
print(f'''
t.penup()
t.goto({x}, {y})
t.pendown()
for _ in range(2):
t.forward({width})
t.right(90)
t.forward({height})
t.right(90)
''')
def draw_line(t, attrib):
x1 = float(attrib['x1']) - 400
y1 = 0 - (float(attrib['y1']) - 300)
x2 = float(attrib['x2']) - 400
y2 = 0 - (float(attrib['y2']) - 300)
t.penup()
t.goto(x1, y1)
t.pendown()
t.goto(x2, y2)
print(f'''
t.penup()
t.goto({x1}, {y1})
t.pendown()
t.goto({x2}, {y2})
''')
# 可以继续添加其他元素的绘制函数
if __name__ == "__main__":
svg_file = r"svg_path"
draw_svg(svg_file)
print('输出完毕')
原理很简单,turtle绘画时每执行一部就把那一步 所执行的脚本print出来。
以上次“Elan”的svg图片为例,输出效果如下:
import turtle
screen = turtle.Screen()
screen.setup(800, 600)
screen.bgcolor("white")
t = turtle.Turtle()
t.speed(0)
t.penup()
t.goto(-264.0, 168.0)
t.pendown()
t.goto(-249.0, -82.0)
t.penup()
t.goto(-189.0, 167.0)
t.pendown()
t.goto(-261.0, 164.0)
t.penup()
t.goto(-178.0, 86.0)
t.pendown()
t.goto(-248.0, 61.0)
t.penup()
t.goto(-179.0, -38.0)
t.pendown()
t.goto(-245.0, -65.0)
t.penup()
t.goto(-134.0, 149.0)
t.pendown()
t.goto(-139.0, -42.0)
t.penup()
t.goto(-135.0, -60.0)
t.pendown()
t.goto(-78.0, -29.0)
t.penup()
t.goto(-20.0, 169.0)
t.pendown()
for _ in range(2):
t.forward(39.0)
t.right(90)
t.forward(301.0)
t.right(90)
t.penup()
t.goto(-23.0, 209.0)
t.pendown()
for _ in range(2):
t.forward(142.0)
t.right(90)
t.forward(37.0)
t.right(90)
t.penup()
t.goto(75.0, 155.0)
t.pendown()
for _ in range(2):
t.forward(41.0)
t.right(90)
t.forward(291.0)
t.right(90)
t.penup()
t.goto(28.0, 59.0)
t.pendown()
for _ in range(2):
t.forward(36.0)
t.right(90)
t.forward(46.0)
t.right(90)
t.hideturtle()
turtle.done()
完美运行。