最近接触到 Python的一个绘图模块 Turtle,很有趣也很容易的一个模块。花了2个小时的时间学习了一下相关的函数。这个模块的文档链接如下。
https://docs.python.org/3/library/turtle.html
简单的说,可以把画板想象成一个X-Y的坐标轴,原点就在中间,一个海龟在坐标图里面到处跑,他的爬行痕迹就是我们生成的图形。我们可以通过控制坐标的位置,方向,颜色,基本图形和移动方向来创建各种有趣的图案。
比如说,我打算生成一个随机的线路,每次转变方向用不同的颜色表示。
from turtle import Turtle, Screen
import random
import colorgram
import turtle as t
#设置颜色类型为RGB格式,默认为字符串
t.colormode(255)
tim = Turtle()
#设置一个随机的方向选择
options=[0,90,180,270]
#生成随机的RGB元组
def randomcolor():
r= random.randint(0,255)
g= random.randint(0,255)
b = random.randint(0, 255)
return (r,g,b)
tim.speed('fastest')
#随机选择一个方向,选择一个颜色,线条加粗
def randomwalk():
tim.setheading(random.choice(options))
tim.color(randomcolor())
tim.speed('fast')
tim.pensize(10)
tim.forward(20)
for i in range(100):
randomwalk()
screen = Screen()
screen.exitonclick()
再比如说 我打算生成一个万花筒,其实就是画圆,每次画圆,偏移一定的角度,随机生成一些颜色就行了
from turtle import Turtle, Screen
import random
import colorgram
import turtle as t
#设定颜色模式,不然默认是字符串的格式,而不是RGB的格式
t.colormode(255)
tim = Turtle()
#生成一个随机的RGB的元组
def randomcolor():
r= random.randint(0,255)
g= random.randint(0,255)
b = random.randint(0, 255)
return (r,g,b)
tim.speed('fastest')
def draw_spirograph(size):
for i in range(int(360/size)):
tim.circle(100)
tim.color(randomcolor())
print(tim.heading())
#每次画圆都偏移一下方向
current_heading=tim.heading()
tim.setheading(current_heading+size)
tim.circle(100)
draw_spirograph(10)
#下面的部分是生成一个画板界面,点击退出,不然默认一闪而过就没有了
screen = Screen()
screen.exitonclick()
效果如下
最后再看一个例子,如何生成了一个10X10的 点图。说起点图,最出名的是一个叫 Damie Hirst的艺术家,他的点图能卖个上百万美元 ??!! 艺术品大概就和下面的样子差不多。
那么用我们的海龟模块,我们可以很轻松的模拟一个出来。 首先下载一个Damie的大作,转换成jpg格式,通过colorgram的模块 我们可以获取到Damie到底使用了哪些颜色的RGB,保存为一个列表,我们就可以随机地获取颜色生成自己的点图了。
from turtle import Turtle, Screen
import random
import colorgram
import turtle as t
#设置颜色模式为RGB
t.colormode(255)
tim = Turtle()
#从一个现有的jpg图获取主要的色彩
colors=colorgram.extract('spot.jpg',20)
colorlist=[]
for color in colors:
# print(color.rgb)
colorlist.append((color.rgb.r,color.rgb.g,color.rgb.b))
print(colorlist)
#隐藏海龟的小图标和画图的路径,设置爬行速度为最快
tim.penup()
tim.hideturtle()
tim.speed('fastest')
#因为海龟默认是从原点(图正中央)开始爬,如果内容太多的话可能会爬出边界,所以我先把他的坐标往左下方挪一挪
tim.setheading(225)
tim.forward(300)
tim.setheading(0)
currentlocation=tim.position()
print(currentlocation)
#简单的双重循环,每次生成一个随机颜色的点,唯一注意的就是海龟爬的方向和坐标了
for i in range(10):
for j in range(10):
tim.dot(30,random.choice(colorlist))
tim.forward(40)
tim.setposition((currentlocation[0]),40*(i+1)+currentlocation[1])
#这个screen的对象保证画板需要手动关闭
screen = Screen()
screen.exitonclick()
最后效果如下