#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: 5forward(200) 6left(170) 7if abs(pos()) < 1: 8break 9 end_fill() 10 done()
效果如圖:
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): 21if 0 <= i < 30 or 60 <= i < 90: 22a = a+0.08 23t.lt(3)# 向左轉3度 24t.fd(a)# 向前走a的步長 25else: 26a = a-0.08 27t.lt(3) 28t.fd(a) 29t.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): 78if 0 <= i < 30 or 60 <= i <90: 79a = a+0.08 80t.lt(3)# 向左轉3度 81t.fd(a)# 向前走a的步長 82else: 83a = a-0.08 84t.lt(3) 85t.fd(a) 86t.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()
效果如圖: