今天学到了python的turtle绘图,感觉还蛮好玩的。在知乎、python123上看到很多大佬的绘图,感觉很有意思,看到有些结合了random库、time库画出来的二叉树很美、很神奇。
我也搜到很多turtle绘图的教程,比如CSDN上发的Python海龟绘图法详细介绍,结果发现CSDN这篇文章是从官网turtle库中文介绍搬运而来,直接去看官网文档就好了。
官网上说:“海龟绘图很适合用来引导孩子学习编程。…… 最初来自于 Logo 编程语言。” turtle库画图虽然上手简单,但是也不要小看了,结合一些其他库(random库、time库)和函数递归就能画出很复杂炫酷的图。
python自带了一些turtle画图的demo在Command Prompt敲下面的代码就可以打开啦,这里有别人放的demo。
python -m turtledemo
这里也可以演示单独的脚本,就可以直接看到画出的图,bytedesign是演示脚本名,可以根据文档中提供的清单换成其他的demo。这些demo有些还挺复杂的,融合python其他的知识,乍一看可能看不懂,先mark一下。
python -m turtledemo.bytedesign
名称 | 描述 | 相关特性 |
---|---|---|
bytedesign | 复杂的传统海龟绘图模式 | tracer() , delay, update() |
chaos | 绘制 Verhulst 动态模型,演示通过计算机的运算可能会生成令人惊叹的结果 | 世界坐标系 |
clock | 绘制模拟时钟显示本机的当前时间 | 海龟作为表针, ontimer |
colormixer | 试验 r, g, b 颜色模式 | ondrag() 当鼠标拖动 |
forest | 绘制 3 棵广度优先树 | 随机化 |
fractalcurves | 绘制 Hilbert & Koch 曲线 | 递归 |
lindenmayer | 文化数学 (印度装饰艺术) | L-系统 |
minimal_hanoi | 汉诺塔 | 矩形海龟作为汉诺盘 (shape, shapesize) |
nim | 玩经典的“尼姆”游戏,开始时有三堆小棒,与电脑对战。 | 海龟作为小棒,事件驱动 (鼠标, 键盘) |
paint | 超极简主义绘画程序 | onclick() 当鼠标点击 |
peace | 初级技巧 | 海龟: 外观与动画 |
penrose | 非周期性地使用风筝和飞镖形状铺满平面 | stamp() 印章 |
planet_and_moon | 模拟引力系统 | 复合开关, Vec2D 类 |
round_dance | 两两相对并不断旋转舞蹈的海龟 | 复合形状, clone shapesize, tilt, get_shapepoly, update |
sorting_animate | 动态演示不同的排序方法 | 简单对齐, 随机化 |
tree | 一棵 (图形化的) 广度优先树 (使用生成器) | clone() 克隆 |
two_canvases | 简单设计 | 两块画布上的海龟 |
wikipedia | 一个来自介绍海龟绘图的维基百科文章的图案 | clone() , undo() |
yinyang | 另一个初级示例 | circle() 画圆 |
colormixer
这是demo中的 colormixer,用来试验 r, g, b 颜色模式 结合了ondrag()
实现鼠标拖动的交互功能,蛮神奇的!!
还有一些简单好玩的小例子我放在下面,下面这几个是看了嵩天老师python课程的初学者就能搞定的,上面那些可能还要琢磨琢磨,我暂时就搞不定。
粉色小爱心
from turtle import *
color('pink')
begin_fill()
left(135)
fd(100)
right(180)
circle(50,-180)
left(90)
circle(50,-180)
right(180)
fd(100)
end_fill()
hideturtle()
done()
七段数码管绘制
嵩天老师七段数码管绘制的案例,涉及到函数的使用、time库、turtle库的知识,是个蛮有意思的小案例。
科赫雪花绘制
涉及函数递归的思想和方法,就是一个函数调用自己,好像很简单,但是又有点绕 = = 汉诺塔的递归方法求解就让人摸不着头脑
树的代码
来源于知乎,没明白原答案中turtle为啥import两次,这里改动了一下,还是可以正常运行。
import random
import turtle as t
# 树的主体
def tree(branchLen):
if branchLen > 3:
if branchLen < 8: # 最短的树枝部分
if random.randint(0, 1) == 0:
t.color('snow')
else:
t.color('lightcoral') # 珊瑚色
t.pensize(branchLen / 2)
elif 8 <= branchLen <= 12:
if random.randint(0, 2) == 0:
t.color('snow')
else:
t.color('lightcoral')
t.pensize(branchLen / 3)
else: # 表示树干部分 >12
t.color('sienna') # 赭色
t.pensize(branchLen / 10)
t.forward(branchLen)
a = 1.5 * random.random()
t.right(20*a)
b = 1.5 * random.random()
tree(branchLen-10*b) # 递归 树枝变细
t.left(40*a)
tree(branchLen-10*b)
t.right(20*a)
t.up()
t.backward(branchLen)
t.down()
def petal(m): # 树下花瓣
for i in range(m):
a = 200 - 400 * random.random()
b = 10 - 20 * random.random()
t.up()
t.forward(b)
t.left(90)
t.forward(a)
t.down()
t.color("lightcoral")
t.circle(1)
t.up()
t.backward(a)
t.right(90)
t.backward(b)
def main():
t.getscreen().tracer(5, 0)
t.screensize(bg='wheat')
t.left(90)
t.up()
t.backward(150)
t.down()
t.color('sienna')
tree(60)
petal(100)
t.ht()
t.exitonclick()
main()