|
4 F" M# A3 V! d" e0 b 来源:Python爬虫与数据挖掘 4 a$ W8 Z5 b n: q( F3 ]
作者:Python进阶者
. a5 G1 e# E7 Z7 o4 } Z Hello,大家好。我是Python进阶者。 + E* W5 A' m: I
前言 7 u7 ^8 }2 ^. v: C* \" Z
大家平时用程序画图的时候是不是都觉得比较棘手了,今天给大家介绍个神奇的画图模块-----turtle。它可以通过一些指令让画笔任意移动,可以说是很智能了。 - k! s: p6 N% i; p! M1 Q1 n
导入模块
# P" J: R6 ~- c import turtle / K' V) @4 l* d/ H1 X2 O3 B7 x" I, c
turtle基本用法
" Z2 _2 @5 C2 p* E7 H 一、设置画布大小
# p6 X* T. T D; R) N2 x" | 要想画图就要先有画布,不然没法让图显示,我们可以先设置画布大小:
2 b& W0 F7 D& e8 |- N& ` turtle.screensize(width,height,color) #设置宽度 高度 颜色 % B4 y7 |" c+ A. u* p) o/ N
二、设置画布坐标
. D8 r$ t$ R# M2 v7 {( t0 s 我们画图不光要设置画布,还要对画布的容器主界面进行设置,不然主界面显示不了,画布自然也不会显示。 . a H9 L6 M( O' a& ^. B
turtle.setup(width,height, startx,starty) #设置宽度 高度 开始x坐标 开始y坐标 1 D; U8 n6 ?. P/ R* e, ]) g f5 f* R5 @
三、显示主界面5 {: g6 i# M' Z
这个跟tkinter显示主界面有点相似,也是使用mainloop()方法才可以显示界面:
+ V; p7 m0 v7 D( i5 D; o import turtle% I. G% o$ L2 N
turtle.Screen().title(绘图工具) #设置绘图窗口的标题
- d. e/ A5 c7 i turtle.screensize(400,400, "red") #画布大小背景颜色
+ d. v3 w9 V" W5 p6 \, r turtle.setup(width=600,height=600, startx=300, starty=50) #绘图窗口的大小和起始坐标
) ]7 B$ l7 D: o+ f) O- z, R/ i6 R) k turtle.mainloop() #显示主界面# ~# A; y( ~) g7 [% {
, g; S0 Y! ^) Y' G3 F W0 ^8 M4 ~3 U! D. j7 E, c
t = turtle.Pen() #钢笔
) P5 \* C5 Y# j6 F t.shape("turtle") #海龟的形状:arrow,turtle,circle,square,triangle,classic
2 x" {( d: ~, ?. U4 q t.resizemode() #大小调整模式:auto,user,noresize. w6 C. y. L( E7 a: ^3 s
turtle.bgcolor(black)#背景颜色 & |) M ^9 C2 E( B$ h9 S* ^" Q
/ U4 \1 W7 b' s1 ?0 n, p/ q 四、设置绘图画笔
, {6 P: J% A: W# U* _- _; D/ L 因为海龟绘图是以画笔来进行绘画的,所以我们得生成一个画笔来进行画画。我们需要对一个画笔的大小和颜色来进行设置:
; ^. d L. F2 X9 P9 p; e* e0 x" B& P turtle.pencolor(green) #设置画笔的颜色为绿色,默认黑色 color()
( l( |: n3 i9 s' g h turtle.pensize(1) #设置画笔大小 turtle.width()5 b' U. O4 O% \0 J8 _
turtle.speed() #设置画笔速度 范围是[0,10]
6 U9 D' O& _/ m1 a2 s6 y$ C$ j #也可以使用turtle.Pen()
J; Q0 n3 Y! m, X. g- ^8 h
" ~$ f3 P7 G: s$ }7 N( `- X3 y 这样就生成了我们的第一个箭头,海龟绘图就是通过这个箭头的移动轨迹来达到绘图目的的。
9 F' T y9 U' r8 k 五、基本绘图命令- I& B1 K8 L& j) u& ]% b7 f8 f! z
接下来我们让这个箭头动起来,给他一点灵魂,免得它像稻草人一样一动不动,说干就干。
/ d9 [1 ]8 \# i- G! ]9 f: H- b% Y 1.前进 * C0 H8 y0 n; G
turtle.forward(100) #向前进100个像素
( N- Y. ]$ A. l1 P turtle.fd(100)
1 t. r- S% R1 e1 ^: U 2.后退
2 A- q& q2 U; t, ?$ p! _0 T3 E5 W: h turtle.backward(200) #向后退200个像素,下方方法相同
4 h2 m! k5 N2 x turtle.back(200). x% B5 @; X- q( _
turtle.bk(200)
7 f! |, H$ |& L; j 3.移动到 8 w( K* ~" v5 {* t) \2 P( K
turtle.goto(100,200) #直接移动到坐标为(100,200)的位置,下方效果一样
. ]9 ?' E1 g1 h turtle.setpos(100,200)+ b& y3 \( \( I N5 m. S
turtle.setposition(100,200)
+ l8 z$ c a6 Q 4.左移
" l; {, u1 s( c# w- @0 ] turtle.left(50)#向左移动50个像素
7 }1 Y# x% P/ z, q, X( \* r. Y turtle.lt(50)
# _& h H4 m+ a, ^7 [1 T: T 5.右移 / D+ i1 ]$ J4 B6 ~
turtle.right(60)#向右移动60个像素
* ? g6 S+ p1 P H4 x turtle.rt(60)
* w* c" F4 d0 T$ i" }: Z 6.准备移动 ; t% V4 B" |% r/ _3 O7 y5 g$ r# E
turtle.penup()
# g" l5 _; z, J3 } turtle.Pen().up()
. n3 |+ p f8 D5 G 7.暂停移动 ! y/ t- @& [4 d% L& f- l
turtle.pendown()
" ?; h' L" F, z9 b) B3 E& M5 ~5 R turtle.Pen().down()
0 I& v% j0 I9 `2 ^+ L 8.画圆 3 t( E2 r3 \9 k) R) T M
turtle.circle(半径, 弧度, 内置多边形数)
" |/ V' B0 V; ? turtle.dot(int) #也可以画圆 $ s$ r3 L2 U0 M, v5 w- q2 h% P
9.移动x轴 o4 C, b M( A. w
turtle.setx(100) #x轴移动100个像素 ) K* E( i) e" T8 P/ ^: C! S
10.移动y轴
- P* p7 w* a6 r+ |; ~' z turtle.sety(100) #y轴移动100个像素 0 O6 p/ o' i+ D4 f9 @" t. N8 ?
11.设置当前朝向的角度
% S* m* S9 ~) S/ w6 O turtle.setheading(90)#当前角度为90( F7 _" A/ ^3 Q$ T, X5 F
turtle.seth(90). p3 [+ |6 H+ {: t
在standard模式下逆时针(北方) 它模式下顺时针(东方)
* r; N0 C5 e' a+ l7 K' H' n 12.设置当前画笔位置为原点 & z0 w7 P; f: ~ P Y1 J
turtle.home() 6 ?: d. q' }# e# y! B
3 H# u+ ^& k9 ]( G 我们可以看到海龟最后停留的位置和画笔最初的落脚点的位置,代码如下: : `) p8 F- F1 ^4 z- U, M! a
import turtle
# o1 j$ W4 ]7 h( G! O3 a, Q import time6 R }/ g( Q5 C& s$ z4 d% ~" l
t=turtle.Pen()2 F0 }! D: a4 o" D6 n5 d
t.shape(turtle)' Q/ g0 U1 v1 Y0 u0 n; U
t.pencolor(green)
F/ j, C5 c: B- Q& g turtle.bgcolor(gray)
5 }- I" P- ^. g t.width=3
7 O- w( q( y* l3 C time.sleep(1)
* I4 K. _/ v) V, K t.penup()#准备移动
8 k' V- Y6 ^& C. W5 G9 K t.forward(100)#向前进100个像素7 _1 k6 X- A: u5 i
time.sleep(1)3 S! Z8 C& i: B4 o& Z& n/ R$ s
t.backward(200) #向后退200个像素# S3 I. {8 x) z4 m$ c
time.sleep(1)) k3 A6 y K6 b& P8 s1 D6 t: e
t.goto(100,200) #直接移动到坐标为(100,200)的位置7 K" \+ F4 d% l1 a7 l
time.sleep(1)" W% W4 S9 W* I- l. w1 A
t.left(50)#向左移动50个像素6 R9 c" f( F8 x4 ^- y9 f
time.sleep(1): m, W3 |/ c; ^. H3 \6 r
t.right(60)#向右移动60个像素+ j: K2 |0 r: W' z9 t
time.sleep(1)1 f$ V, p" H; z8 ^
t.penup()#准备移动
3 \/ K. [9 D- Y9 x t.setx(100)#x轴移动100个像素 ~' v- k; u: C* J
time.sleep(1)
" w0 ~& n* ], ^- Y# _2 \ t.sety(100) #y轴移动100个像素' q- \. s+ U+ M: Q
turtle.seth(90)6 a+ W5 K# G. p c R$ R+ z
turtle.home()
4 j. D% d: S* e/ S1 P turtle.mainloop() #主界面一直保持,不退出
4 V4 _; x( N- x3 C: l& ] 我们也可以将海龟的运行轨迹显示出来: $ e' R. w8 {+ S, I# D( g3 p, f
$ _1 n* {9 e& ~ }4 e( C: B turtle.Screen().title(绘图工具) #设置绘图窗口的标题8 ^* U2 p8 Y* Y* D* l+ j9 }) [
turtle.screensize(400,400, "red") #画布大小背景颜色
# I g. X- w( M! m% B turtle.setup(width=600,height=600, startx=300, starty=50) #绘图窗口的大小和起始坐标, \- W- a$ `9 t( d7 `6 d3 Q
turtle.pensize(1)& Z% ? O+ t+ n$ ?$ X, r8 v U) g: g
turtle.pencolor(green) #画笔颜色
& }$ v7 z% R( I3 _+ v/ O turtle.speed(2)
* k4 Y4 s1 L1 e; x, f9 @ turtle.forward(100) #前进1004 n0 s' j* A, J" @& E4 {$ [
time.sleep(1)7 Z E2 Q. @0 x. x9 K) \5 `
turtle.setposition(100,100) #移动到位置(100,100)7 a5 U6 S8 ?+ ?( ^9 P$ _
time.sleep(1)
( [/ L% e; d& u; v( f3 _ turtle.bk(100) #后退1003 y( Z7 Y+ g, _; j+ C6 Q
time.sleep(1)
4 M. n$ Y- O3 M0 d9 [ turtle.circle(100,100,5) #画多边形轮廓
$ X; p3 i0 _8 ` time.sleep(1)
6 @% A1 E8 O8 E1 e% r turtle.dot(50) #画圆
C! x) @+ D5 X time.sleep(1)
& g9 R Q$ k3 Q) e; ?2 R turtle.setx(100) #移动x轴
g- {6 B# _4 b' B9 n: a! m 13.复制当前图形
1 {) X+ u# y& D turtle.stamp() : ]# k3 q' d o1 k% d
14.清除当前图形
7 |+ [; t. {' U' K% m+ w- M. m turtle.clearstamp() ' S {' b( X) v2 t+ u, a5 d
15.清除多个图形
J3 ?8 c! B3 p$ x2 @: H- r# }; P' P turtle.clearstamps() 4 B' O; c- {' _: L' O2 V, E+ } }
16.撤销操作 6 E, C& s+ G1 W- V) }
turtle.undo() 8 B8 h L! c* D& N1 e% S0 Y
17.获取当前海龟坐标 6 [8 ~& `" Q/ ?7 w7 L
turtle.position()
% E1 O3 J+ O* l. m& } turtle.pos()
# }1 d/ n* J p9 T 18.获取海龟当前坐标与(x,y)的夹角 9 P, I1 _* |; M" X S) U) Z7 R
tutrle.towards(x,y) ( x' d$ [) `/ i& b6 c/ |# K( b* L4 ?
19.获取x坐标
3 F; d( m$ @* d3 ^1 h5 \0 T tutrle.xcor() 2 p9 _4 k5 v* b! J) e" {- Z
20.获取y坐标
) d8 a' c# j# h _5 Y; V, |$ F tutrle.ycor() $ x( X6 D6 M5 x2 B3 d5 e
21.获取箭头的朝向
' V; D f1 r: N3 S) Q7 X: K tutrle.heading() " p* B+ G# ^5 u
22.获取箭头坐标和设置的坐标的距离 ( b" F2 L; ~% i5 J
turtle.distance(x,y) 4 n# r& T% R5 ]* }" M8 [
23、清空当前绘图窗口,海龟状态不变 % a4 X t0 { k" ^1 I3 g0 C6 @1 c
turtle.clear()( Z* g& O% j) s' A
turtle.clearscreen()
8 f; f& s: m9 H/ W1 z0 Q( D 24.清空窗口,重新设置海龟状态
+ _' s% ]% x) \5 B8 k5 | turtle.reset()* {& c& v) `* t( Q A0 H: _
turtle.resetscreen() 3 ~8 ^. [1 {9 t/ \! [! }3 [
25.判断当前海龟是否可见 & L3 F3 G) ~! ?4 n4 I' X
turtle.isvisible() + {" b7 o7 s% G
26.写入文本 3 _+ t2 u4 O& S6 d
turtle.write(text,font) 3 Z/ i$ I& A) x: |7 h0 d+ m
27.绘制填充颜色 8 c6 {* |; y: D# f; ^( H
turtle.fillcolor(red)
: Z" ?2 i" G T% d) ` 28.判断画笔是否落下 # f2 v1 F- F% v: x( k- p
turtle.isdown (注意:没有isup方法) 3 E7 r0 b+ e+ h
29.隐藏海龟 5 e, s% P3 q, c# M0 y" p
turtle.hideturtle()
* `# z& D( \1 y( S) \ turtle.ht() # U X% n) [ z4 O" R! H. T; A
30.显示海龟 5 U$ o4 K1 r1 ~* j+ Z& H4 o& `
turtle.showturtle()' S/ y1 I6 o( }' y8 ]
turtle.st() / ]- _" H0 l1 Q; `4 }$ Z
31.填充颜色 4 y$ d- |6 W/ C# o1 K4 N/ W% w% Y
turtle.fillcolor(black)
. U: u" a$ E2 {! A 32.开始填充 6 a+ }" A1 R1 \0 ~+ }$ v0 i9 B
turtle.begin_fill() 9 T$ h) G& h; w3 C) {/ d- f* l
33.结束填充 ' h/ O4 a: T; L8 [# h9 c: q: q
turtle.end_fill() _" O& N' P1 q5 g- t3 @1 G
34.设置圆的度数,默认值为360度
" j+ I2 z& ]" A turtle.degrees(fullcircle=360.0) 2 R2 s, @$ }0 W9 {7 ^+ X3 `
35.将圆的度数设置成2π ! M0 @' W. m& s( N. Q
turtle.radians()
, X- ]! E" s3 y0 u
, S0 q5 H: \7 N# \4 ?1 B$ d turtle.Screen().title(绘图工具) #设置绘图窗口的标题
/ B9 N; q, _. q i t=turtle.screensize(400,400, "red") #画布大小背景颜色
8 B0 t0 D: k3 m turtle.setup(width=600,height=600, startx=300, starty=50) #绘图窗口的大小和起始坐标
: f* @, ~6 D( X( t6 l3 a, r& U9 N' s5 G turtle.pensize(1)& K6 T# }* g& \: R, J8 Q; s" w# l
turtle.pencolor(green)% o. d* Y2 ~5 f' Z
turtle.speed(2)
7 Z5 e! y1 d+ b6 { turtle.forward(100)! P* J) {/ w5 S# U& N
turtle.circle(40)
. [2 g4 J/ T* t/ w id=turtle.stamp() #生成id5 c4 P, ?3 }5 F" `5 z/ r' u
turtle.goto(100,200) #移动到(100,200); p5 s; T$ o/ e: c$ V' N
turtle.clearstamp(id) #删除id
6 `3 H6 p( e0 ]& W: W1 ^/ p2 J turtle.undo() #撤销操作6 E9 p/ ^( e, L& S
print(turtle.pos()) #海龟当前坐标
) O+ L# L; u0 O5 H ? print(turtle.towards(100,100)) #当前坐标与设置的坐标的夹角3 s4 i7 u3 O+ \+ I; u4 k
print(turtle.xcor(),turtle.ycor()) #获取x,y坐标
3 u& F) {: q3 V; U* \3 u print(turtle.heading())#获取箭头朝向
! N/ B( C- b5 [% X+ ]6 `! ] print(turtle.distance(100,100))#当前坐标与设置的坐标的距离
% ^4 {2 O% k8 b turtle.clear() #清空绘图窗口; i% Y% u" [3 W: V3 j4 I
turtle.reset() #重新设置海龟状态 A4 [; }& n4 i: [& v; v7 A
turtle.forward(100)#向前进100个像素
; L4 n, T$ g* q+ T0 f8 J3 M if turtle.isvisible(): #判断海龟是否可见,可见则后退300像素
: [3 |% ?* F% g3 `% _ turtle.back(300): }; e n' }& B. \9 ^0 J
turtle.write(任性的90后boy)
$ m* _" U+ v9 b+ x turtle.fillcolor(blue) #海龟的颜色填充为蓝色7 w9 @4 @( Z' M. I
turtle.begin_fill() #开始填充) J1 ~' }+ L* d$ z
turtle.goto(100,-100): s. ~- [/ d" D3 K/ j
turtle.forward(150)
9 s. \$ C, b8 V turtle.end_fill() #结束填充6 p! v f D3 z' b! c
turtle.fillcolor(black) #
$ Z( D: m/ X6 T2 c9 S turtle.begin_fill()+ T6 e8 N' W( y( C l+ b
turtle.pencolor(yellow)
7 W4 @" X8 G H/ K. o _ turtle.circle(40)
" f- H N6 e0 m D6 F turtle.end_fill()8 M$ k0 I" @% e: U5 H$ q
turtle.mainloop()
* R7 r. k! N6 G6 C& r 这一部分主要讲海龟的运行轨迹的变化过程。
) P* _5 R7 B3 | 36.海龟的启动和停止
; B0 K% ?& W1 L( d4 _) N turtle.mainloop()
/ d) E7 H( O0 B* f- ? turtle.done
6 q6 o t8 J% V" D, r) P$ i 37.设置海龟的模式
/ i5 B+ b, C8 u; z9 ` turtle.mode(mode) standard 逆时针 它 顺时针 world # o9 R/ d5 _2 N; s7 V4 ^/ ?
38.设置或返回以毫秒为单位的绘图延迟
/ q3 B+ {# R0 l turtle.delay(delay=None)
( w+ Y/ _" K& V6 x 39.开始记录多边形的第一个顶点 2 b, i7 D4 F q
turtle.begin_poly()
& K3 ^& T* W6 e' E3 y y. h0 Z 40.停止记录多边形的最后一个顶点 , [% I2 x5 M2 t: z d5 u
turtle.end_poly()
! m/ t/ |5 z z 41.返回最后记录的多边形 ( |) {8 d' s6 w9 R) ]1 z
turtle.get_poly() , O: ~2 ^3 T g3 J# j% e5 e
5 Q1 u8 g. g; p0 E: F; d* J
turtle.Screen().title(绘图工具) #设置绘图窗口的标题
& i! j v" ?" _: |, y t=turtle.screensize(400,400, "red") #画布大小背景颜色% E6 D. a9 W4 }( b0 D" p
turtle.setup(width=600,height=600, startx=300, starty=50) #绘图窗口的大小和起始坐标
, b7 }, J! T& M! e9 {( T7 Z turtle.pensize(1)
4 X9 c) a9 @: l1 b! E1 f# S turtle.pencolor(green)
/ q% a# K3 a( X5 t* N( a- t. K turtle.speed(2)/ z- n: @! B- K6 D; B6 Z% l, ^. k9 c) Y
turtle.begin_poly() #开始记录- H2 H1 j& }8 h" O( \. P8 [
for i in range(4):
# |! P8 m+ d7 f. Y turtle.forward(100)" f4 _3 `7 k3 y% T! s7 H
turtle.right(90)
8 C# h8 G' t- C turtle.end_poly() #结束记录$ j! h8 Y( ~: S" t) y5 I
print(turtle.get_poly()) #获取捕获到的绘图坐标2 ?; `. ~ `! g+ x G
turtle.clear() #清除当前绘图
3 E4 S% q0 o8 G s% k/ G o turtle.mode(它)* [ O7 n; s4 r
turtle.forward(100)
' h) x l& D7 B0 B/ c$ p+ z turtle.ht() #隐藏
; N* h! d q/ U7 o# u turtle.left(100)
) H" p' l2 [/ D$ P$ | turtle.delay(delay=100)#每100毫秒绘制一点+ M% e" G& u. c5 W: N# N H6 r
turtle.goto(200,50)( b0 s) P8 }. c: d/ P9 S5 }
turtle.st() #显示
; j; A# ? U, i( w. | turtle.reset()#回到起点9 E) D, ?, N3 i# P+ y+ P" G0 |" R+ z
time.sleep(1)
& S% {2 n2 f" \2 S! U for x in range(100):& q% {. y8 l0 a% I D G
for y in range(200):
H( T5 U/ K: x: v6 P' ? turtle.forward(100)$ z! B. J: m9 v" R/ B8 u
turtle.left(200)8 o& u. H% ], d5 _& C$ Z5 F
turtle.goto(x,y) #不断移动位置
$ g: Q) X0 L2 b/ _; k& y if turtle.pos()==(10,10): #如果当前位置为(10,10)
( p% f8 }9 }' x turtle.done #销毁窗口2 a2 i6 B6 ~- V" c5 F% ]% }
turtle.mainloop() 2 Y2 T/ W0 T& K8 A+ G; L& P
. v e: V/ ^) X+ D6 } 这里显示了最初绘图的坐标,其实它绘制的是一个矩形。
, W% v" g. b, H" x" \% [ 总结8 r4 c9 u; Z( E2 X* N' W
从这里看出,海龟画图的确是一个很不错的模块,它能十分迅速并且很方便的帮助我们进行绘图,只需要短短几个辨识度比较高的英文进行组合便可以绘制精美的图形。当然它还有很多其它的用法,这里不在一一细说,大家可以慢慢琢磨。 # `) X9 A% n9 M& z8 \5 j, N
/ C* ?- K" U% U9 F( j( G
: x! w& W% d% ~3 U1 S
9 S2 _9 I% }* w# d" r3 F+ c
; M& o0 a4 G% R- P1 H/ s0 N |