Turtle库的学习积累
1.什么是turtle庫
??Turtle庫是Python語言中一個很流行的繪制圖像的函數庫,想象一個小烏龜,在一個橫軸為x、縱軸為y的坐標系原點,(0,0)位置開始,它根據一組函數指令的控制,在這個平面坐標系中移動,從而在它爬行的路徑上繪制了圖形。
2.turtle繪制圖像基礎
2.1?畫布:
? 畫布就是turtle為我們展開用于繪圖區域,我們可以設置它的大小和初始位置。
? ? ? ? 設置畫布大小
width :?窗口寬度,值為整數則對應像素值;值為小數則為窗口寬度與屏幕的比例。
height :?窗口高度,值為整數則對應像素值;值為小數則為窗口高度與屏幕的比例。
startx :?窗口左側與屏幕左側的像素距離,值為None則窗口位于窗口水平中央。
starty :?窗口右側與屏幕右側的像素距離,值為None則窗口位于窗口垂直中央。
? ? ? ? ?turtle.screensize(canvwidth=None, canvheight=None, bg=None),參數分別為畫布的寬(單位像素), 高, 背景顏色。
? ? ? ? 如:turtle.screensize(800,600, "green")
? ? ? ? ? ? ? ?turtle.screensize()?#返回默認大小(400, 300)
? ? ? ??turtle.setup(width=0.5, height=0.75, startx=None, starty=None),參數:width, height: 輸入寬和高為整數時, 表示像素; 為小數時, 表示占據電腦屏幕的比例,(startx, starty): 這一坐標表示矩形窗口左上角頂點的位置, 如果為空,則窗口位于屏幕中心。
? ? ? ? 如:turtle.setup(width=0.6,height=0.6)
? ? ? ? ? ? ? ?turtle.setup(width=800,height=800, startx=100, starty=100)
setup ( width , height , startx , starty )
?
?2.2畫筆:
2.2.1 畫筆的狀態:
? ? ? ? 在畫布上,默認有一個坐標原點為畫布中心的坐標軸,坐標原點上有一只面朝x軸正方向小烏龜。這里我們描述小烏龜時使用了兩個詞語:坐標原點(位置),面朝x軸正方向(方向), turtle繪圖中,就是使用位置方向描述小烏龜(畫筆)的狀態。
2.2.2 畫筆的屬性:
? ? ? ? 畫筆(畫筆的屬性,顏色、畫線的寬度等)
? ? ? ? 1) turtle.pensize():設置畫筆的寬度;
? ? ? ? 2) turtle.pencolor():沒有參數傳入,返回當前畫筆顏色,傳入參數設置畫筆顏色,可以是字符串如"green", "red",也可以是RGB 3元組。
? ? ? ? 3) turtle.speed(speed):設置畫筆移動速度,畫筆繪制的速度范圍[0,10]整數,數字越大越快。
2.2.3 繪圖命令
? ? ? ? ?操縱海龜繪圖有著許多的命令,這些命令可以劃分為3種:一種為運動命令,一種為畫筆控制命令,還有一種是全局控制命令。
(1)????畫筆運動命令
| 命令 | 說明 |
| 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) | 繪制一個指定直徑和顏色的圓點 |
?
(2)???? 畫筆控制命令
| 命令 | 說明 |
| 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形狀 |
?
(3)????全局控制命令
| 命令 | 說明 |
| 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參數也是可選項 |
?
(4)????其他命令
| 命令 | 說明 | |||||||||
| 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() | 返回最后記錄的多邊形。 |
?
2.3. 命令詳解
? ? ? ? turtle.circle(radius, extent=None, steps=None)
? ? ? ? 描述:以給定半徑畫圓
? ? ? ? 參數:
? ? ? ? radius(半徑):半徑為正(負),表示圓心在畫筆的左邊(右邊)畫圓;
? ? ? ? extent(弧度) (optional);
? ? ? ? steps (optional) (做半徑為radius的圓的內切正多邊形,多邊形邊數為steps)。
? ? ? ?舉例:
? ? ? ?circle(50) # 整圓;
? ? ? ?circle(50,steps=3) # 三角形;
? ? ? ?circle(120, 180) # 半圓
#RGB色彩體系
rgb的色彩取值范圍為0-255的整數或者0-1的小數
?
切換RBG模式
turtle.colormode(mode)
1.0:RGB小數模式
255:RGB整數模式
2.4.形狀繪制函數
turtle.fd(distance) / forward(distance)?作用:向小烏龜前進的方向前進distance距離,distance 為前進距離的像素值
turtle.bk(distance) / backward(distance)? 作用:向小烏龜前進的方向后退distance距離,distance 為后退距離的像素值
turtle.lt(angle) / left(angle)?作用:左轉,angle?為左轉的角度
turtle.rt(angle) / right(angle)?作用:angle?為右轉的角度
turtle.seth(angle) / setheading(angle)? 作用:angle?為轉到的角度,即改變繪圖的方向
turtle.circle(radius [,extent])? 作用:繪制以radius為半徑、以angle為角度的弧形
(extent?為None時,繪制整個圓;radius?為正數時,繪制的圖形在小海龜左側;radius?為負數時,繪制的圖形在小海龜右側)
turtle.ht() / hideturtle()? 作用:隱藏小海龜
turtle.st() / showturtle()? 作用:顯示小海龜
turtle.fillcolor(colorstring)? 作用:填充顏色
turtle.begin_fill()? 作用:開始填充圖形
turtle.end_fill()? 作用:填充完成
2.5 控制命令
| 命令 | 說明 |
| home() | 使小海龜回到初始位置?(0,0) |
| clear() | 清空窗口,但小海龜的位置和狀態不變 |
| reset() | 清空窗口,且重置小海龜的狀態為初始狀態 |
| undo() | 撤銷上一個動作 |
| stamp() | 復制當前圖形 |
| write(s [,font=(“font_name”,font_size,”font_type”)]) | 寫文本,s 為文本內容,font 是字體的參數,內部分別是字體名稱,大小和類型 |
?
3.繪制圖像實例
(1)玫瑰花繪制
?
import turtle as t # 定義一個曲線繪制函數(用t來代替turtle)
def DegreeCurve(n, r, d=1):
for i in range(n):
t.left(d)
t.circle(r, abs(d)) # 初始位置設定
s = 0.2 # 尺寸
t.setup(450*5*s, 750*5*s) #設置窗口大小
t.pencolor("black") #畫筆顏色
t.fillcolor("red") ?#填充顏色
t.speed(100) #加速
t.penup() #下筆
t.goto(0, 900*s)
t.pendown() # 繪制花朵形狀
t.begin_fill() #開始
t.circle(200*s,30)
DegreeCurve(60, 50*s)
t.circle(200*s,30)
DegreeCurve(4, 100*s)
t.circle(200*s,50)
DegreeCurve(50, 50*s)
t.circle(350*s,65)
DegreeCurve(40, 70*s)
t.circle(150*s,50)
DegreeCurve(20, 50*s, -1)
t.circle(400*s,60)
DegreeCurve(18, 50*s)
t.fd(250*s)
t.right(150)
t.circle(-500*s,12)
t.left(140)
t.circle(550*s,110)
t.left(27)
t.circle(650*s,100)
t.left(130)
t.circle(-300*s,20)
t.right(123)
t.circle(220*s,57)
t.end_fill() # 結束花瓣的繪制
t.left(120) # 開始繪制花枝
t.fd(280*s)
t.left(115)
t.circle(300*s,33)
t.left(180)
t.circle(-300*s,33)
DegreeCurve(70, 225*s, -1)
t.circle(350*s,104)
t.left(90)
t.circle(200*s,105)
t.circle(-500*s,63)
t.penup()
t.goto(170*s,-30*s)
t.pendown()
t.left(160)
DegreeCurve(20, 2500*s)
DegreeCurve(220, 250*s, -1) # 結束
t.fillcolor('green') # 繪制一個綠色葉子
t.penup()
t.goto(670*s,-180*s)
t.pendown()
t.right(140)
t.begin_fill()
t.circle(300*s,120)
t.left(60)
t.circle(300*s,120)
t.end_fill()
t.penup()
t.goto(180*s,-550*s)
t.pendown()
t.right(85)
t.circle(600*s,40) # 結束
t.penup() # 繪制另一個綠色葉子
t.goto(-150*s,-1000*s)
t.pendown()
t.begin_fill()
t.rt(120)
t.circle(300*s,115)
t.left(75)
t.circle(300*s,100)
t.end_fill()
t.penup()
t.goto(430*s,-1070*s)
t.pendown()
t.right(30)
t.circle(-600*s,35)
t.done() #玫瑰花結束繪制
?
?
?
?
?(2)時鐘程序
#?coding=utf-8??
import?turtle??
from?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()??
?
?
轉載于:https://www.cnblogs.com/Exin/p/10527263.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的Turtle库的学习积累的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java 字符数字得到整数
- 下一篇: 错误随笔记