Python学习笔记六——画小猪佩奇
使用Python的turtle
库可以绘制多种图形,先设置画布、画笔等公共参数,然后分部分绘制图形,小猪佩奇的效果图:
示例代码(摘自公众号:数据分析联盟,更多代码参见http://isteps.cn/docs/python/turtle/examples.php):
from turtle import*
def nose(x,y):#鼻子
penup()#提起笔
goto(x,y)#定位
pendown()#落笔,开始画
setheading(-30)#将乌龟的方向设置为to_angle/为数字(0-东、90-北、180-西、270-南)
begin_fill()#准备开始填充图形
a=0.4
for i in range(120):
if 0<=i<30 or 60<=i<90:
a=a+0.08
left(3) #向左转3度
forward(a) #向前走a的步长
else:
a=a-0.08
left(3)
forward(a)
end_fill()#填充完成
penup()
setheading(90)
forward(25)
setheading(0)
forward(10)
pendown()
pencolor(255,155,192)#画笔颜色
setheading(10)
begin_fill()
circle(5)
color(160,82,45)#返回或设置pencolor和fillcolor
end_fill()
penup()
setheading(0)
forward(20)
pendown()
pencolor(255,155,192)
setheading(10)
begin_fill()
circle(5)
color(160,82,45)
end_fill()
def head(x,y):#头
color((255,155,192),"pink")
penup()
goto(x,y)
setheading(0)
pendown()
begin_fill()
setheading(180)
circle(300,-30)
circle(100,-60)
circle(80,-100)
circle(150,-20)
circle(60,-95)
setheading(161)
circle(-300,15)
penup()
goto(-100,100)
pendown()
setheading(-30)
a=0.4
for i in range(60):
if 0<=i<30 or 60<=i<90:
a=a+0.08
lt(3) #向左转3度
fd(a) #向前走a的步长
else:
a=a-0.08
lt(3)
fd(a)
end_fill()
def ears(x,y): #耳朵
color((255,155,192),"pink")
penup()
goto(x,y)
pendown()
begin_fill()
setheading(100)
circle(-50,50)
circle(-10,120)
circle(-50,54)
end_fill()
penup()
setheading(90)
forward(-12)
setheading(0)
forward(30)
pendown()
begin_fill()
setheading(100)
circle(-50,50)
circle(-10,120)
circle(-50,56)
end_fill()
def eyes(x,y):#眼睛 公众号 数据分析联盟
color((255,155,192),"white")
penup()
setheading(90)
forward(-20)
setheading(0)
forward(-95)
pendown()
begin_fill()
circle(15)
end_fill()
color("black")
penup()
setheading(90)
forward(12)
setheading(0)
forward(-3)
pendown()
begin_fill()
circle(3)
end_fill()
color((255,155,192),"white")
penup()
seth(90)
forward(-25)
seth(0)
forward(40)
pendown()
begin_fill()
circle(15)
end_fill()
color("black")
penup()
setheading(90)
forward(12)
setheading(0)
forward(-3)
pendown()
begin_fill()
circle(3)
end_fill()
def cheek(x,y):#腮 公众号 数据分析联盟
color((255,155,192))
penup()
goto(x,y)
pendown()
setheading(0)
begin_fill()
circle(30)
end_fill()
def mouth(x,y): #嘴 公众号 数据分析联盟
color(239,69,19)
penup()
goto(x,y)
pendown()
setheading(-80)
circle(30,40)
circle(40,80)
def body(x,y):#身体 公众号 数据分析联盟
color("red",(255,99,71))
penup()
goto(x,y)
pendown()
begin_fill()
setheading(-130)
circle(100,10)
circle(300,30)
setheading(0)
forward(230)
setheading(90)
circle(300,30)
circle(100,3)
color((255,155,192),(255,100,100))
setheading(-135)
circle(-80,63)
circle(-150,24)
end_fill()
def hands(x,y):#手 公众号 数据分析联盟
color((255,155,192))
penup()
goto(x,y)
pendown()
setheading(-160)
circle(300,15)
penup()
setheading(90)
forward(15)
setheading(0)
forward(0)
pendown()
setheading(-10)
circle(-20,90)
penup()
setheading(90)
forward(30)
setheading(0)
forward(237)
pendown()
setheading(-20)
circle(-300,15)
penup()
setheading(90)
forward(20)
setheading(0)
forward(0)
pendown()
setheading(-170)
circle(20,90)
def foot(x,y):#脚 公众号 数据分析联盟
pensize(10)
color((240,128,128))
penup()
goto(x,y)
pendown()
setheading(-90)
forward(40)
setheading(-180)
color("black")
pensize(15)
fd(20)
pensize(10)
color((240,128,128))
penup()
setheading(90)
forward(40)
setheading(0)
forward(90)
pendown()
setheading(-90)
forward(40)
setheading(-180)
color("black")
pensize(15)
fd(20)
def tail(x,y):#尾巴 公众号 数据分析联盟
pensize(4)
color((255,155,192))
penup()
goto(x,y)
pendown()
seth(0)
circle(70,20)
circle(10,330)
circle(70,30)
def setting(): #参数设置
pensize(4) #设置画笔的大小
hideturtle() #使乌龟无形(隐藏)
colormode(255) #将其设置为1.0或255.随后 颜色三元组的r,g,b值必须在0 .. cmode范围内
color((255,155,192),"pink")
setup(840,500)
speed(10)
def main():
setting() #画布、画笔设置
nose(-100,100) #鼻子
head(-69,167) #头
ears(0,160) #耳朵
eyes(0,140) #眼睛
cheek(80,10) #腮
mouth(-20,30) #嘴
body(-32,-8) #身体
hands(-56,-45) #手
foot(2,-177) #脚
tail(148,-155) #尾巴
done()
if __name__ == '__main__':
main()
画布
设置画布大小:
(1).turtle.screensize(canvwidth=None, canvheight=None, bg=None)
,参数分别为画布的宽(单位像素),高,背景颜色。
(2).turtle.setup(width=0.5, height=0.75, startx=None, starty=None)
,width, height
:输入宽和高为整数时,表示像素;为小数时,表示占据电脑屏幕的比例,(startx, starty)
:这一坐标表示矩形窗口左上角顶点的位置,如果为空,则窗口位于屏幕中心。
画笔
属性设置
使用坐标原点位置、x轴正方向描述画笔的状态。
设置属性 | 方法描述 |
---|
turtle.pensize() | 设置画笔的宽度 |
turtle.pencolor() | 没有参数传入,返回当前画笔颜色,传入参数设置画笔颜色,可以是字符串如"green", “red”,也可以是RGB 3元组。 |
turtle.speed(speed) | 设置画笔移动速度,画笔绘制的速度范围[0,10]整数,数字越大越快。 |
操纵命令
运动命令
命令 | 说明 |
---|
turtle.forward(distance) | 向当前画笔方向移动distance 像素长度 |
turtle.backward(distance) | 向当前画笔相反方向移动distance 像素长度 |
turtle.right(degree) | 顺时针移动degree ° |
turtle.left(degree) | 逆时针移动degree ° |
turtle.pendown() | 移动时绘制图形,缺省时也为绘制 |
turtle.goto(x,y) | 将画笔移动到坐标为x,y 的位置 |
turtle.penup() | 提起笔移动,不绘制图形,用于另起一个地方绘制 |
turtle.circle(radius, extent=None, steps=None) | 做半径为radius 的圆的内切正多边形,多边形边数为steps ;radius 半径为正(负),表示圆心在画笔的左边(右边)画圆;extent 为弧度 |
setx( ) | 将当前x 轴移动到指定位置 |
sety( ) | 将当前y 轴移动到指定位置 |
setheading(angle) | 设置当前朝向为angle 角度 |
home() | 设置当前画笔位置为原点,朝向东 |
dot(r) | 绘制一个指定直径和颜色的圆点 |
画笔控制命令
命令 | 说明 |
---|
turtle.fillcolor(colorstring) | 绘制图形的填充颜色 |
turtle.color(color1, color2) | 同时设置pencolor=color1 , fillcolor=color2 |
turtle.filling() | 返回当前是否在填充状态 |
turtle.begin_fill() | 准备开始填充图形 |
turtle.end_fill() | 填充完成 |
turtle.hideturtle() | 隐藏画笔的turtle 形状 |
turtle.showturtle() | 显示画笔的turtle 形状 |
全局控制命令
命令 | 说明 |
---|
turtle.clear() | 清空turtle 窗口,但是turtle 的位置和状态不会改变 |
turtle.reset() | 清空窗口,重置turtle 状态为起始状态 |
turtle.undo() | 撤销上一个turtle 动作 |
turtle.isvisible() | 返回当前turtle 是否可见 |
stamp() | 复制当前图形 |
turtle.write(s [,font=(“font-name”,font_size,“font_type”)]) | 写文本,s 为文本内容,font 是字体的参数,分别为字体名称,大小和类型;font 为可选项,font 参数也是可选项 |
其他命令
命令 | 说明 |
---|
turtle.mainloop()或turtle.done() | 启动事件循环 -调用Tkinter 的mainloop 函数。必须是乌龟图形程序中的最后一个语句。 |
turtle.mode(mode=None) | 设置乌龟模式(“standard ”,“logo ”或“world ”)并执行重置。如果没有给出模式,则返回当前模式。standard 模式:初始龟标题为“向右(东)”,正角度为“逆时针”;logo 模式:初始龟标题为“向上(北)”,正角度为“顺时针”。 |
turtle.delay(delay=None) | 设置或返回以毫秒为单位的绘图延迟。 |
turtle.begin_poly() | 开始记录多边形的顶点。当前的乌龟位置是多边形的第一个顶点。 |
turtle.end_poly() | 停止记录多边形的顶点。当前的乌龟位置是多边形的最后一个顶点。将与第一个顶点相连。 |
turtle.get_poly() | 返回最后记录的多边形。 |