turtle 庫
turtle 庫是 Python 的標准庫之一,是 Python 的基礎繪圖庫
也就是說,turtle 庫就是用來繪制基本圖形的
而 turtle 又有 “海龜” 的意思,所以也被稱為 “海龜” 庫
我們可以想象一只海龜,在位於顯示器的窗體上游走,它游走的軌跡就形成了繪制的圖形
海龜的運動是由程序控制的,它可以變換顏色,改變尺寸、大小等
畫筆
在畫布上,默認有一個坐標原點為畫布中心的坐標軸,坐標原點上有一只面朝X軸正方向小烏龜
turtle 繪圖中,就是使用位置方向描述小烏龜(畫筆)的狀態
我們可以通過畫筆的屬性更改畫筆的寬度、顏色以及移動速度
-
turtle.pensize():設置畫筆的寬度
-
turtle.pencolor():沒有參數傳入,返回當前畫筆顏色;傳入參數設置畫筆顏色
-
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() |
畫圓,半徑為正(負),表示圓心在畫筆的左邊(右邊)畫圓 |
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”)並執行重置 如果沒有給出模式,則返回當前模式
|
|||||||||
turtle.delay(delay=None) |
設置或返回以毫秒為單位的繪圖延遲 |
|||||||||
turtle.begin_poly() |
開始記錄多邊形的頂點 當前的烏龜位置是多邊形的第一個頂點 |
|||||||||
turtle.end_poly() |
停止記錄多邊形的頂點 當前的烏龜位置是多邊形的最后一個頂點 將與第一個頂點相連 |
|||||||||
turtle.get_poly() |
返回最后記錄的多邊形 |
🌰:繪制時鍾
1 """ 用Python實現的實時時鍾 """ 2 3 #導入模塊 4 import turtle 5 from datetime import * 6 7 8 # 繪圖窗口設置 9 def Skip(step): 10 turtle.penup() 11 turtle.forward(step) 12 turtle.pendown() 13 14 15 # 繪制指針長度 16 def mkHand(name, length): 17 # 清空窗口,重置狀態 18 turtle.reset() 19 Skip(-length * 0.1) 20 21 # 開始記錄多邊形的頂點 22 turtle.begin_poly() 23 turtle.forward(length * 1.1) 24 25 # 停止記錄多邊形的頂點 26 turtle.end_poly() 27 28 # 返回最后記錄的多邊形。 29 handForm = turtle.get_poly() 30 turtle.register_shape(name, handForm) 31 32 33 # 時鍾初始化 34 def Init(): 35 # 秒針、分針、時針、文字 36 global secHand, minHand, hurHand, printer 37 38 # 設置turtl模式:logo:向上(北);順時針 39 turtle.mode("logo") 40 41 # 建立三個指針Turtle並初始化 42 # 設置三個指針的長度:秒、分、時針 43 mkHand("secHand", 135) 44 mkHand("minHand", 125) 45 mkHand("hurHand", 90) 46 # 初始化秒針 47 secHand = turtle.Turtle() 48 secHand.shape("secHand") 49 # 初始化分針 50 minHand = turtle.Turtle() 51 minHand.shape("minHand") 52 # 初始化時針 53 hurHand = turtle.Turtle() 54 hurHand.shape("hurHand") 55 56 for hand in secHand, minHand, hurHand: 57 hand.shapesize(1, 1, 3) 58 hand.speed(0) 59 60 # 顯示文字的Turtle 61 printer = turtle.Turtle() 62 # 隱藏畫筆的形狀 63 printer.hideturtle() 64 printer.penup() 65 66 67 # 繪制時鍾 68 def SetupClock(radius): 69 # 繪制時鍾的外框 70 turtle.reset() 71 turtle.pensize(7) 72 73 for i in range(60): 74 Skip(radius) 75 # 時鍾整點數值 76 if i % 5 == 0: 77 turtle.forward(20) 78 Skip(-radius - 20) 79 Skip(radius + 20) 80 # 數值:12點 81 if i == 0: 82 turtle.write(int(12), align="center", font=("Courier", 14, "bold")) 83 # 數值:6點 84 elif i == 30: 85 Skip(25) 86 turtle.write(int(i/5), align="center", font=("Courier", 14, "bold")) 87 Skip(-25) 88 # 數值:5、7點 89 elif (i == 25 or i == 35): 90 Skip(20) 91 turtle.write(int(i/5), align="center", font=("Courier", 14, "bold")) 92 Skip(-20) 93 # 數值:1、2、3、4、8、9、10、11點 94 else: 95 turtle.write(int(i/5), align="center", font=("Courier", 14, "bold")) 96 97 Skip(-radius - 20) 98 # 時鍾刻度 99 else: 100 turtle.dot(5) 101 Skip(-radius) 102 103 turtle.right(6) 104 105 106 # 設置時鍾星期 107 def Week(t): 108 # 周一/周日 109 week = ["星期一", "星期二", "星期三","星期四", "星期五", "星期六", "星期日"] 110 # 返回星期 111 return week[t.weekday()] 112 113 114 # 設置時鍾日期 115 def Date(t): 116 # 年 117 y = t.year 118 # 月 119 m = t.month 120 # 日 121 d = t.day 122 # 返回日期:年-月-日 123 return "%s-%d-%d" % (y, m, d) 124 125 126 # 繪制時鍾指針 127 def Tick(): 128 # 獲取當前時間 129 t = datetime.today() 130 # 時間:秒 131 second = t.second + t.microsecond * 0.000001 132 # 時間:分 133 minute = t.minute + second / 60.0 134 # 時間:時 135 hour = t.hour + minute / 60.0 136 # 設置秒針一周 = 6° * 60秒 137 secHand.setheading(6 * second) 138 secHand.color("red") 139 # 設置分針一周 = 6° * 60分 140 minHand.setheading(6 * minute) 141 # 設置時針一周 = 30° * 12時 142 hurHand.setheading(30 * hour) 143 144 turtle.tracer(False) 145 146 # 顯示星期 147 printer.forward(50) 148 printer.write(Week(t), align="center", font=("Courier", 20, "bold")) 149 # 顯示日期 150 printer.back(130) 151 printer.write(Date(t), align="center", font=("Courier", 20, "bold")) 152 153 printer.home() 154 turtle.tracer(True) 155 # 間隔100ms后繼續調用tick繪制時鍾指針 156 turtle.ontimer(Tick, 100) 157 158 159 def main(): 160 # 關閉繪制動畫 161 turtle.tracer(False) 162 # 初始化設置 163 Init() 164 # 繪制時鍾 165 SetupClock(160) 166 # 打開繪制動畫 167 turtle.tracer(True) 168 # 繪制指針 169 Tick() 170 # 啟動循環事件 171 turtle.mainloop() 172 173 174 if __name__ == "__main__": 175 176 main()
繪制的效果:
*** | 以上內容僅為學習參考、學習筆記使用 | ***