|
|
Turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x、纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行的路径上绘制了图形。; Y3 _8 D# P7 l9 L+ |) E: i
turtle绘图的基础知识: \) m$ x2 Q4 {/ @3 g6 d( G
1. 画布(canvas)/ f* h$ q2 z1 F% f% x
画布就是turtle为我们展开用于绘图区域,我们可以设置它的大小和初始位置。
$ r- c3 h- _1 K+ f: |设置画布大小5 R' |+ E, A* s6 E
turtle.screensize(canvwidth=None, canvheight=None, bg=None),参数分别为画布的宽(单位像素), 高, 背景颜色。4 i7 L- O5 X+ A" {3 `0 [
如:turtle.screensize(800,600, "green")
6 W: Z0 y! E4 a2 ^- x/ Z) R! bturtle.screensize() #返回默认大小(400, 300)
9 K. l. d/ i: x" Mturtle.setup(width=0.5, height=0.75, startx=None, starty=None),参数:width, height: 输入宽和高为整数时, 表示像素; 为小数时, 表示占据电脑屏幕的比例,(startx, starty): 这一坐标表示矩形窗口左上角顶点的位置, 如果为空,则窗口位于屏幕中心。* I1 t2 ~" q9 }
如:turtle.setup(width=0.6,height=0.6): S9 S5 X- t1 q
turtle.setup(width=800,height=800, startx=100, starty=100)/ j8 @9 ~/ R, A& e
2. 画笔
$ a2 i6 S' Y0 H0 ~2.1 画笔的状态- y2 }4 n/ R! p. A2 y* s; W
在画布上,默认有一个坐标原点为画布中心的坐标轴,坐标原点上有一只面朝x轴正方向小乌龟。这里我们描述小乌龟时使用了两个词语:坐标原点(位置),面朝x轴正方向(方向), turtle绘图中,就是使用位置方向描述小乌龟(画笔)的状态。
* R. X: n) o& G8 f9 K7 R2.2 画笔的属性9 F" b3 G3 z* O l; r: U, x; c3 Y
画笔(画笔的属性,颜色、画线的宽度等)3 o6 a7 Y( Q$ U& J
1) turtle.pensize():设置画笔的宽度;
' j. G- A" _) e, d0 F6 J2) turtle.pencolor():没有参数传入,返回当前画笔颜色,传入参数设置画笔颜色,可以是字符串如"green", "red",也可以是RGB 3元组。! \! N) D: b9 U" M3 [
3) turtle.speed(speed):设置画笔移动速度,画笔绘制的速度范围[0,10]整数,数字越大越快。
9 l {9 j* S! {9 J" i8 c- C2.3 绘图命令
& W$ Y/ i- ?. _操纵海龟绘图有着许多的命令,这些命令可以划分为3种:一种为运动命令,一种为画笔控制命令,还有一种是全局控制命令。
* T+ z2 l$ P% s; B5 R/ }* x(1) 画笔运动命令, v- Y0 J$ U7 n/ I6 ~8 Q
命令 说明
3 {. T6 |6 h9 Y- i+ i7 G$ kturtle.forward(distance) 向当前画笔方向移动distance像素长度4 C+ {, e, {7 e/ B9 D6 j+ v
turtle.backward(distance) 向当前画笔相反方向移动distance像素长度7 L7 d- |+ {: l. y
turtle.right(degree) 顺时针移动degree°
E4 r7 a3 K7 H9 ~4 \/ R4 Bturtle.left(degree) 逆时针移动degree°
: S3 i$ O: R2 o+ U7 vturtle.pendown() 移动时绘制图形,缺省时也为绘制0 c( g4 k, k5 @5 h0 [' G5 k
turtle.goto(x,y) 将画笔移动到坐标为x,y的位置! G( M1 C: n7 _) O! {, {
turtle.penup() 提起笔移动,不绘制图形,用于另起一个地方绘制% z' p3 N7 Z U1 f# S# p/ f
turtle.circle() 画圆,半径为正(负),表示圆心在画笔的左边(右边)画圆
* x" S: q6 E7 b, L4 t( L- Wsetx( ) 将当前x轴移动到指定位置
* s1 K7 N0 b8 v) Qsety( ) 将当前y轴移动到指定位置
) ?5 k, i7 F" R5 ysetheading(angle) 设置当前朝向为angle角度" V$ j9 {* [# { U' f5 q; Z
home() 设置当前画笔位置为原点,朝向东。
& |4 l( u3 k. X6 f+ e! `# x2 J+ S/ sdot(r) 绘制一个指定直径和颜色的圆点1 E0 R, T# X4 X7 a+ y6 O. @3 J
(2) 画笔控制命令
9 n" y) L9 B% L命令 说明
1 v1 `, J. T ~- h* v" l& J: j) T) Dturtle.fillcolor(colorstring) 绘制图形的填充颜色1 l, K! r" |. W4 T7 o% m. S8 q
turtle.color(color1, color2) 同时设置pencolor=color1, fillcolor=color23 {6 W ~2 T3 @7 Z# n
turtle.filling() 返回当前是否在填充状态- I' g, r: p X# D, [1 N
turtle.begin_fill() 准备开始填充图形
( d7 ?3 W1 R: R% Gturtle.end_fill() 填充完成
: W; ^8 ^( n0 k6 \. M/ Y3 ?* ]( yturtle.hideturtle() 隐藏画笔的turtle形状
1 F$ v9 _/ u" V" g1 t Nturtle.showturtle() 显示画笔的turtle形状9 X5 j2 F! K. ^! W0 @2 ~' y
(3) 全局控制命令" [2 @1 g; ^ |
命令 说明# A6 H$ k" R. [: r- l
turtle.clear() 清空turtle窗口,但是turtle的位置和状态不会改变/ A! h- ~" _, t9 Y/ s* [
turtle.reset() 清空窗口,重置turtle状态为起始状态: n! K% o0 E: K, I9 H( K; F( l
turtle.undo() 撤销上一个turtle动作
0 E, ]* l& x. @turtle.isvisible() 返回当前turtle是否可见, g$ e! r1 w& L# q* F8 U
stamp() 复制当前图形
# q( n3 o3 h# ~turtle.write
" K) _$ }- z# t+ l+ B5 q(s [,font=("font-name",font_size,"font_type")]) 写文本,s为文本内容,font是字体的参数,分别为字体名称,大小和类型;font为可选项,font参数也是可选项; n5 `/ z3 x- j
(4) 其他命令" d! u6 V& b; J
+ G }; T6 U! m% c
3. 命令详解
: j }- s) t& D. I/ _3.1 turtle.circle(radius, extent=None, steps=None); l7 j5 X4 m0 q' _
描述:以给定半径画圆# Z8 g9 w" G: z( q+ }) x+ k }
参数:
) a1 R/ M- x7 K& x [ `# Sradius(半径):半径为正(负),表示圆心在画笔的左边(右边)画圆; x5 ]7 u6 W! q2 [7 [1 G2 Y" n
extent(弧度) (optional);* B+ U$ k3 g! r8 N& `
steps (optional) (做半径为radius的圆的内切正多边形,多边形边数为steps)。
# I9 K& C( ~% k/ A7 m举例:
7 ^( ~& F* A. h6 u Gcircle(50) # 整圆;8 F Z7 |/ [( T% y+ K0 T
circle(50,steps=3) # 三角形;5 X; k4 y8 L- x; Z3 r3 a
circle(120, 180) # 半圆, d2 Q3 o# M" `3 `2 E% w2 n v7 y
实例:2 y- D9 L# \7 t" }% i
1、太阳花
- H& `$ V# d3 d& X% W5 o, ]3 m+ M# coding=utf-8import turtleimport time # 同时设置pencolor=color1, fillcolor=color2turtle.color("red", "yellow") turtle.begin_fill()for _ in range(50):turtle.forward(200)turtle.left(170)turtle.end_fill() turtle.mainloop()" |- W( O/ c7 l8 i( Q& p
2、五角星
0 D. h$ F7 H& |4 K0 t# coding=utf-8import turtleimport time turtle.pensize(5)turtle.pencolor("yellow")turtle.fillcolor("red") turtle.begin_fill()for _ in range(5): turtle.forward(200) turtle.right(144)turtle.end_fill()time.sleep(2) turtle.penup()turtle.goto(-150,-120)turtle.color("violet")turtle.write("Done", font=('Arial', 40, 'normal')) turtle.mainloop()
9 D+ A* x& E9 l3 C3、时钟程序
! q( O1 V9 V2 ]( ]% h+ k/ s# coding=utf-8 import turtlefrom datetime import * # 抬起画笔,向前运动一段距离放下def Skip(step): turtle.penup() turtle.forward(step) turtle.pendown() def mkHand(name, length): # 注册Turtle形状,建立表针Turtle turtle.reset() Skip(-length * 0.1) # 开始记录多边形的顶点。当前的乌龟位置是多边形的第一个顶点。 turtle.begin_poly() turtle.forward(length * 1.1) # 停止记录多边形的顶点。当前的乌龟位置是多边形的最后一个顶点。将与第一个顶点相连。 turtle.end_poly() # 返回最后记录的多边形。 handForm = turtle.get_poly() turtle.register_shape(name, handForm) def Init(): global secHand, minHand, hurHand, printer # 重置Turtle指向北 turtle.mode("logo") # 建立三个表针Turtle并初始化 mkHand("secHand", 135) mkHand("minHand", 125) mkHand("hurHand", 90) secHand = turtle.Turtle() secHand.shape("secHand") minHand = turtle.Turtle() minHand.shape("minHand") hurHand = turtle.Turtle() hurHand.shape("hurHand") for hand in secHand, minHand, hurHand: hand.shapesize(1, 1, 3) hand.speed(0) # 建立输出文字Turtle printer = turtle.Turtle() # 隐藏画笔的turtle形状 printer.hideturtle() printer.penup() def SetupClock(radius): # 建立表的外框 turtle.reset() turtle.pensize(7) for i in range(60): Skip(radius) if i % 5 == 0: turtle.forward(20) Skip(-radius - 20) Skip(radius + 20) if i == 0: turtle.write(int(12), align="center", font=("Courier", 14, "bold")) elif i == 30: Skip(25) turtle.write(int(i/5), align="center", font=("Courier", 14, "bold")) Skip(-25) elif (i == 25 or i == 35): Skip(20) turtle.write(int(i/5), align="center", font=("Courier", 14, "bold")) Skip(-20) else: turtle.write(int(i/5), align="center", font=("Courier", 14, "bold")) Skip(-radius - 20) else: turtle.dot(5) Skip(-radius) turtle.right(6) def Week(t): week = ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"] return week[t.weekday()] def Date(t): y = t.year m = t.month d = t.day return "%s %d%d" % (y, m, d) def Tick(): # 绘制表针的动态显示 t = datetime.today() second = t.second + t.microsecond * 0.000001 minute = t.minute + second / 60.0 hour = t.hour + minute / 60.0 secHand.setheading(6 * second) minHand.setheading(6 * minute) hurHand.setheading(30 * hour) turtle.tracer(False) printer.forward(65) printer.write(Week(t), align="center", font=("Courier", 14, "bold")) printer.back(130) printer.write(Date(t), align="center", font=("Courier", 14, "bold")) printer.home() turtle.tracer(True) # 100ms后继续调用tick turtle.ontimer(Tick, 100) def main(): # 打开/关闭龟动画,并为更新图纸设置延迟。 turtle.tracer(False) Init() SetupClock(160) turtle.tracer(True) Tick() turtle.mainloop() if __name__ == "__main__": main()
( ^* {2 T# r& A |
|