#18 turtle模塊

前言

這一節繼續記錄模塊,本節將記錄Python中一個非常重要的畫圖模塊——turtle,Here we go!

一、turtle模塊

turtle(海龜)模塊是Python中強大的內置畫圖模塊,可以模擬真實的畫圖環境以及畫圖步驟來畫圖。通常,我們畫圖需要兩種工具,一個是畫布,另一個是畫筆;在turtle中,同樣需要這兩種工具,首先來學習畫布的設置

1. 畫布

畫布無非不過設置畫布大小、背景顏色、畫布在桌面的位置,turtle模塊中,有兩種畫布的設置方法,需要時可將它們結合起來使用:

turtle.screensize(canvwidth=400, canvheight=300, bg=None)   「canvwidth表示畫布寬、canvheight表示畫布高、bg表示背景顏色」

In [19]: import turtle                             # 導入turtle模塊

In [21]: turtle.screensize()                       # 設置默認尺寸
Out[21]: (400, 300)

In [22]: turtle.screensize(800,600)                # 將畫布大小改為800x600,單位是像素
 
In [23]: turtle.screensize(800,600,bg='green')     # 也可以設置背景顏色

# 桌面上會出現一個畫布,想要推出,輸入turtle.done(),之後就可以點擊畫布上的x號關閉了

turtle.setup(width=0.5, height=0.75, startx=None, starty=None)   「width表示畫布寬、height表示畫布高、startx表示畫布在桌面上的坐標x位置、starty表示畫布在桌面上的坐標y位置」

In [26]: import turtle

In [28]: turtle.setup()                # 設置默認畫布大小

In [29]: turtle.setup(800,600)         # 將畫布大小改為800x600,單位是像素

In [30]: turtle.setup(0.5,0.5)         # 將畫布大小改為占當前屏幕的0.5x0.5,無單位,這是一個比例

In [31]: turtle.setup(800,600,50,50)   # 設置畫布初始位置為(50,50)

# 注意:當寬高為大於1的整數時,單位為像素;當寬高為小於1的小數時,為占當前屏幕的比例

如果要給有背景色的畫布設置初始位置,則可以將上述兩種方法結合起來使用:

In [34]: import turtle

In [36]: turtle.screensize(bg='green')   # 首先設置背景色

In [37]: turtle.setup(800,600,200,200)   # 再設置寬高和位置

2. 畫筆

說完了畫布設置,就剩下畫筆了,畫筆這一部分有些複雜,因為不僅要設置畫筆的粗細顏色等,還要給畫筆前進後退旋轉等動作

2.1 畫筆設置

turtle.pensize(width=None)   「width表示畫筆的寬度」

In [39]: turtle.pensize(20)   # 設置畫筆的寬度為20像素

turtle.pencolor(*args)   「可以傳入多種參數,例如直接傳入顏色‘green’,也可以傳入RGB配色0.2,0.8,0.55」

In [42]: turtle.pencolor('green')   # 設置畫筆顏色為綠色,直接傳入顏色

In [43]: turtle.pencolor(0.2, 0.8, 0.55)   # 傳入RGB配色

turtle.speed(speed=None)   「speed代表畫筆速度」

In [45]: turtle.speed(5)   # 設置畫筆速度為5

2.2 畫筆動作

turtle.forward(distance) / turtle.fd(distance)  「畫筆前進,distance代表距離」

turtle.backward(distance) / turtle.bk(distance) 「畫筆後退,distance代表距離」

In [50]: turtle.fd(200)   # 畫筆前進200像素

In [51]: turtle.bk(300)   # 畫筆後退300像素

turtle.seth(degree) 「畫筆運動的方向,degree代表角度」

In [77]: turtle.seth(90)   # 畫筆運動方向為90度正方向

# 注意:這個是軸的正方向,不是畫筆的指向,有正負之分,90表示逆時針90度,-90表示順時針90度

turtle.left(degree) 「畫筆逆時針旋轉,degree代表角度」

turtle.right(degree) 「畫筆順時針旋轉,degree代表角度」

In [52]: turtle.left(90)    # 畫筆逆時針旋轉90度

In [54]: turtle.right(90)   # 畫筆順時針旋轉90度

turtle.goto(x,y) 「將畫筆移動到坐標(x,y)處」

In [55]: turtle.goto(300,300)   # 將畫筆移動到坐標(300,300)處

# 注意:假如畫筆現在的位置為(10,10),使用上條命令后,畫筆移動到(300,300)處,這時候會在畫布上留下一條(10,10)到(300,300)的線段

turtle.penup() 「提起畫筆」

In [56]: turtle.penup()     # 將畫筆提起

# 這時候使用前進後退或者goto方法都不會在畫布上留下痕迹

trutle.pendown() 「落下畫筆」

In [57]: turtle.pendown()   # 落下畫筆

# 之後使用前進後退或goto方法會在畫布上留下痕迹

turtle.circle(radius, extent=None, steps=None) 「畫圓方法,radius表示半徑、extent表示圓的角度、steps表示圓內切多邊形的邊數」

In [59]: turtle.circle(50)           # 畫一個半徑為50像素的圓

In [60]: turtle.circle(60,180)       # 畫一個半徑為60像素的半圓

In [61]: turtle.circle(70,steps=6)   # 畫一個內切於半徑為70像素圓的6變形,注意:這是一個多邊形,不是圓

turtle.hideturtle() 「隱藏畫筆箭頭」

turtle.showturtle() 「显示畫筆箭頭」

In [62]: turtle.hideturtle()   # 隱藏畫筆箭頭

In [63]: turtle.showturtle()   # 显示畫筆箭頭

# turtle模塊默認箭頭時显示的,可以將其隱藏

turtle.isvisile() 「返回畫筆箭頭是否存在的結果」

In [71]: turtle.isvisible()   # 返回True,說明畫筆箭頭可見
Out[71]: True

In [72]: turtle.hideturtle()

In [73]: turtle.isvisible()   # 返回False,說明畫筆箭頭不可見
Out[73]: False

 turtle.fillcolor(*args) 「填充顏色設置,可以直接傳入顏色,也可以傳入RGB參數」

In [65]: turtle.fillcolor('yellow')   # 設置填充顏色為黃色

turtle.begin_fill() 「開始填充圖形」

turtle.end_fill() 「結束填充」

In [66]: turtle.begin_fill()   # 準備開始填充圖形

In [67]: turtle.end_fill()     # 結束填充

turtle.flling() 「返回當前圖形是否在填充的結果」

In [68]: turtle.filling()      # 返回False,說明當前圖形不在填充
Out[68]: False

In [69]: turtle.begin_fill()

In [70]: turtle.filling()      # 返回True,說明當前圖形正在填充
Out[70]: True

turtle.undo() 「撤銷上一個畫筆動作」

In [74]: turtle.undo()   # 撤銷上一個畫筆動作

turtle.clear() 「清空畫布,但保留當前畫筆狀態和位置」

In [75]: turtle.clear()   # 清空畫布,保留畫筆狀態和位置

turtle.reset() 「清空畫布,畫筆不再保留原有狀態和位置」

In [76]: turtle.reset()   # 清空畫布,不會保留畫筆狀態和位置

# 注意:畫布屬性沒有被重置,依然保留原畫布大小、背景色和畫布位置

turtle.write(s[,font=(“font-name”,font_size,”font_type”)])) 「畫筆寫字,s代表要寫的字符串、font-name代表字體名稱、font-size代表字體大小、font-type代表字體類型」

In [78]: turtle.write('MinuteSheep')    # 寫下MinuteSheep

turtle.done() 「完成畫作」

In [79]: turtle.done()   # 完成畫作

# 此時可以點擊圖畫上的x號關閉圖畫了

3. 示例

3.1 示例一:太陽花   「來自官網」

 1 from turtle import *
 2 color('red', 'yellow')   # 畫筆顏色為red,填充顏色為yellow
 3 begin_fill()   # 開始填充
 4 while True:
 5     forward(200)
 6     left(170)
 7     if abs(pos()) < 1:
 8         break
 9 end_fill()
10 done()

 效果如圖: 

《#18 turtle模塊》

3.2 示例二:小豬佩奇   「來自:https://www.cnblogs.com/nowgood/p/turtle.html#_nav_11

  1 # coding:utf-8
  2 import turtle as t
  3 # 繪製小豬佩奇
  4 # =======================================
  5 
  6 t.pensize(4)
  7 t.hideturtle()
  8 t.colormode(255)
  9 t.color((255, 155, 192), "pink")
 10 t.setup(840, 500)
 11 t.speed(10)
 12 
 13 # 鼻子
 14 t.pu()
 15 t.goto(-100,100)
 16 t.pd()
 17 t.seth(-30)
 18 t.begin_fill()
 19 a = 0.4
 20 for i in range(120):
 21     if 0 <= i < 30 or 60 <= i < 90:
 22         a = a+0.08
 23         t.lt(3)  # 向左轉3度
 24         t.fd(a)  # 向前走a的步長
 25     else:
 26         a = a-0.08
 27         t.lt(3)
 28         t.fd(a)
 29         t.end_fill()
 30 
 31 t.pu()
 32 t.seth(90)
 33 t.fd(25)
 34 t.seth(0)
 35 t.fd(10)
 36 t.pd()
 37 t.pencolor(255, 155, 192)
 38 t.seth(10)
 39 t.begin_fill()
 40 t.circle(5)
 41 t.color(160, 82, 45)
 42 t.end_fill()
 43 
 44 t.pu()
 45 t.seth(0)
 46 t.fd(20)
 47 t.pd()
 48 t.pencolor(255, 155, 192)
 49 t.seth(10)
 50 t.begin_fill()
 51 t.circle(5)
 52 t.color(160, 82, 45)
 53 t.end_fill()
 54 
 55 #
 56 t.color((255, 155, 192), "pink")
 57 t.pu()
 58 t.seth(90)
 59 t.fd(41)
 60 t.seth(0)
 61 t.fd(0)
 62 t.pd()
 63 t.begin_fill()
 64 t.seth(180)
 65 t.circle(300, -30)
 66 t.circle(100, -60)
 67 t.circle(80, -100)
 68 t.circle(150, -20)
 69 t.circle(60, -95)
 70 t.seth(161)
 71 t.circle(-300, 15)
 72 t.pu()
 73 t.goto(-100, 100)
 74 t.pd()
 75 t.seth(-30)
 76 a = 0.4
 77 for i in range(60):
 78     if 0 <= i < 30 or 60 <= i <90:
 79         a = a+0.08
 80         t.lt(3)  # 向左轉3度
 81         t.fd(a)  # 向前走a的步長
 82     else:
 83         a = a-0.08
 84         t.lt(3)
 85         t.fd(a)
 86         t.end_fill()
 87 
 88 # 耳朵
 89 t.color((255, 155, 192), "pink")
 90 t.pu()
 91 t.seth(90)
 92 t.fd(-7)
 93 t.seth(0)
 94 t.fd(70)
 95 t.pd()
 96 t.begin_fill()
 97 t.seth(100)
 98 t.circle(-50, 50)
 99 t.circle(-10, 120)
100 t.circle(-50, 54)
101 t.end_fill()
102 
103 t.pu()
104 t.seth(90)
105 t.fd(-12)
106 t.seth(0)
107 t.fd(30)
108 t.pd()
109 t.begin_fill()
110 t.seth(100)
111 t.circle(-50, 50)
112 t.circle(-10, 120)
113 t.circle(-50, 56)
114 t.end_fill()
115 
116 #眼睛
117 t.color((255, 155, 192), "white")
118 t.pu()
119 t.seth(90)
120 t.fd(-20)
121 t.seth(0)
122 t.fd(-95)
123 t.pd()
124 t.begin_fill()
125 t.circle(15)
126 t.end_fill()
127 
128 t.color("black")
129 t.pu()
130 t.seth(90)
131 t.fd(12)
132 t.seth(0)
133 t.fd(-3)
134 t.pd()
135 t.begin_fill()
136 t.circle(3)
137 t.end_fill()
138 
139 t.color((255, 155, 192), "white")
140 t.pu()
141 t.seth(90)
142 t.fd(-25)
143 t.seth(0)
144 t.fd(40)
145 t.pd()
146 t.begin_fill()
147 t.circle(15)
148 t.end_fill()
149 
150 t.color("black")
151 t.pu()
152 t.seth(90)
153 t.fd(12)
154 t.seth(0)
155 t.fd(-3)
156 t.pd()
157 t.begin_fill()
158 t.circle(3)
159 t.end_fill()
160 
161 #
162 t.color((255, 155, 192))
163 t.pu()
164 t.seth(90)
165 t.fd(-95)
166 t.seth(0)
167 t.fd(65)
168 t.pd()
169 t.begin_fill()
170 t.circle(30)
171 t.end_fill()
172 
173 #
174 t.color(239, 69, 19)
175 t.pu()
176 t.seth(90)
177 t.fd(15)
178 t.seth(0)
179 t.fd(-100)
180 t.pd()
181 t.seth(-80)
182 t.circle(30, 40)
183 t.circle(40, 80)
184 
185 # 身體
186 t.color("red", (255, 99, 71))
187 t.pu()
188 t.seth(90)
189 t.fd(-20)
190 t.seth(0)
191 t.fd(-78)
192 t.pd()
193 t.begin_fill()
194 t.seth(-130)
195 t.circle(100,10)
196 t.circle(300,30)
197 t.seth(0)
198 t.fd(230)
199 t.seth(90)
200 t.circle(300,30)
201 t.circle(100,3)
202 t.color((255,155,192),(255,100,100))
203 t.seth(-135)
204 t.circle(-80,63)
205 t.circle(-150,24)
206 t.end_fill()
207 
208 #
209 t.color((255,155,192))
210 t.pu()
211 t.seth(90)
212 t.fd(-40)
213 t.seth(0)
214 t.fd(-27)
215 t.pd()
216 t.seth(-160)
217 t.circle(300,15)
218 t.pu()
219 t.seth(90)
220 t.fd(15)
221 t.seth(0)
222 t.fd(0)
223 t.pd()
224 t.seth(-10)
225 t.circle(-20,90)
226 
227 t.pu()
228 t.seth(90)
229 t.fd(30)
230 t.seth(0)
231 t.fd(237)
232 t.pd()
233 t.seth(-20)
234 t.circle(-300,15)
235 t.pu()
236 t.seth(90)
237 t.fd(20)
238 t.seth(0)
239 t.fd(0)
240 t.pd()
241 t.seth(-170)
242 t.circle(20,90)
243 
244 #
245 t.pensize(10)
246 t.color((240,128,128))
247 t.pu()
248 t.seth(90)
249 t.fd(-75)
250 t.seth(0)
251 t.fd(-180)
252 t.pd()
253 t.seth(-90)
254 t.fd(40)
255 t.seth(-180)
256 t.color("black")
257 t.pensize(15)
258 t.fd(20)
259 
260 t.pensize(10)
261 t.color((240, 128, 128))
262 t.pu()
263 t.seth(90)
264 t.fd(40)
265 t.seth(0)
266 t.fd(90)
267 t.pd()
268 t.seth(-90)
269 t.fd(40)
270 t.seth(-180)
271 t.color("black")
272 t.pensize(15)
273 t.fd(20)
274 
275 # 尾巴
276 t.pensize(4)
277 t.color((255, 155, 192))
278 t.pu()
279 t.seth(90)
280 t.fd(70)
281 t.seth(0)
282 t.fd(95)
283 t.pd()
284 t.seth(0)
285 t.circle(70, 20)
286 t.circle(10, 330)
287 t.circle(70, 30)
288 t.done()

效果如圖: 

《#18 turtle模塊》

点赞

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *