摘要:也就是說明這個參數除了表示圓的半徑面,其正負性還定義了畫圓的方向。入門篇中有個小彩蛋,也就是可以修改的指針外形。通過初始化出多只新,可以同時在一個界面上以不同的繪圖。下面給出一段繪制實時時鐘的代碼,重點部分我已給出注釋。
到目前為止我們通過turtle庫了解了Python的基本語法,包括順序與循環、函數的調用與方法的定義、列表與簡單的數學運算等;也學習了用turtle庫繪圖的基本用法,包括坐標與角度、落筆抬筆、顏色與填充等。
但是我們所繪的所有內容僅限于直線,對于曲線的繪制,一直沒有涉及。從現在開始,我們就來了角一下用turtle庫怎么畫曲線,首先我們來畫一個圓,看代碼:
import turtle as t t.circle(100) # 畫一個半徑為100的圓 t.mainloop() # 等效于t.done()
運行這個例子,我們可以看到,turtle從坐標原點開始,按逆時針方向畫出了一個圓。非常簡單,一條語句就實現了。
第一個問題是,如果有希望turtle按順時針方向畫,應該怎樣實現?嗯,將t.circle(100)中的參數100改為-100即可,也就是t.circle(-100)。也就是說明這個參數除了表示圓的半徑面,其正負性還定義了畫圓的方向。修改一下上面的代碼:
import turtle as t t.circle(100) # 從原點開始按逆時針方向畫圓,直徑為100 t.circle(-100) # 從鼠標所在點開始按順時針方向畫圓,直徑為100 t.mainloop()
運行這段代碼,可以看到turtle在界面上畫出一個8字形,先逆時針方向畫圓,再順時針方向畫圓。可以看到turtle畫這兩個圓中的第一個時,相當于從圓的下底開始畫(也即圓的-90度位置);畫第二個圓相當于從上頂位置開始畫(也即90度的位置)。
那么,第二個問題來了,如果我希望從圓的0度位置開始畫,或者180度位置開始畫,應該怎么操作?修改一下上面的實例代碼:
import turtle as t t.setheading(90) # 設置turtle的方向為正北(向上)方向 t.circle(100) # 逆時針畫 t.circle(-100) # 順時針畫 t.mainloop()
運行一下例子,可以看到,第一個圓是從0度位置開始畫的,而第二個圓是從180度位置開始畫的。通過這個小改動,我們可以看到,turtle畫圓時,沒有明確的“圓心”概念,而是以“初始方向+半徑”來決定一個圓的位置和大小。其核心原理等同于割圓術。
接下來,我們來看一下怎樣畫一段弧線,而不是完整的圓。t.circle()的第一個參數是半徑,第二個參數就是圓弧的角度,默認是360度。修改一下上面的例子:
import turtle as t t.setheading(90) t.circle(100, 120) # 畫一段120度的弧線 t.penup() # 抬起筆來 t.goto(0, 0) # 回到圓點位置 t.setheading(90) # 向上畫 t.pendown() # 落筆,開始畫 t.circle(-100, 120) # 畫一段120度的弧線 t.mainloop()
運行這例子,可以看到turtle在界面上向左和向右各畫了兩段弧,即120度長度的弧線。中間增加的抬筆、回圓點、設置初始方向、落筆,主要是為了重新初始化繪圖的前提條件,以便于跟前面的例子做對比。
由此可見,turtle畫曲線的方法還是比較簡陋的,需要配合其它的方向、坐標、位移等來一起實現。接下來,我們來畫一個稍微復雜一點,但是非常有趣的小蛇,看代碼:
import turtle as t t.penup() t.goto(-150, 0) # 到起始點 t.pensize(25) # 設置畫筆粗細 t.pencolor("green") # 設置畫筆顏色 t.setheading(45) # 向45度方向畫 t.pendown() t.circle(-50, 90) # 順時針方向畫90度的弧線 t.circle(50, 90) # 繼續按逆時針方向畫弧 t.circle(-50, 90) t.circle(50, 45) t.setheading(0) # 繼續向0度方向畫 t.forward(50) t.circle(10, 160) # 繼續畫一個160度的小弧 t.setheading(160) # 面向小弧的最后角度 t.forward(8) # 再向前伸一點 t.mainloop()
運行這個小例子,可以看到,turtle在界面上畫出了一條彎彎曲曲的小綠蛇。通過編程,可以清晰的展現出用turtle庫畫弧線,就是要配合方向、坐標、位移等來一起實現。接下來,我們再配合上初級篇中的函數定義,來畫一只小篩子,來模擬我們“師高編程”的LOGO,上代碼:
import turtle as t def hair(): # 畫頭發 t.penup() t.goto(-50, 150) t.pendown() t.fillcolor("#a2774d") t.begin_fill() for j in range(10): # 重復執行10次 t.setheading(60 - (j * 36)) # 每次調整初始角度 t.circle(-50, 120) # 畫120度的弧 t.end_fill() def face(): # 畫臉 t.penup() t.goto(0, 100) t.pendown() t.fillcolor("#f2ae20") t.begin_fill() t.setheading(180) t.circle(85) t.end_fill() #下巴 t.circle(85, 120) t.fillcolor("white") t.begin_fill() t.circle(85, 120) t.setheading(135) t.circle(100, 95) t.end_fill() def ears(dir): # 畫眼睛,dir用來設置方向,左右眼對稱 t.penup() t.goto((0-dir)*30, 90) t.setheading(90) t.pendown() t.fillcolor("#f2ae20") t.begin_fill() t.circle(dir*30) t.end_fill() t.penup() t.goto((0-dir)*40, 85) t.setheading(90) t.pendown() t.fillcolor("white") t.begin_fill() t.circle(dir*17) t.end_fill() def nose(): # 畫鼻子 t.penup() t.goto(20, 0) t.setheading(90) t.pendown() t.fillcolor("#a2774d") t.begin_fill() t.circle(20) t.end_fill() def eye(dir): # 畫耳朵,dir用來設置方向,左右耳對稱 t.penup() t.goto((0-dir)*30, 20) t.setheading(0) t.pendown() t.fillcolor("black") t.begin_fill() t.circle(10) t.end_fill() def mouth(): # 畫嘴巴 t.penup() t.goto(0, 0) t.setheading(-90) t.pendown() t.forward(50) t.setheading(0) t.circle(80, 30) t.penup() t.goto(0, -50) t.setheading(180) t.pendown() t.circle(-80, 30) hair() ears(1) ears(-1) face() eye(1) eye(-1) mouth() nose() t.done()
運行這段代碼,可以看到turtle在界面上畫出一個小獅子的頭像。綜合運用方向、坐標、位移,加上一點耐心和對坐標位置的調試,用turtle的確可以畫出任何你想像的圖形。
入門篇中有個小彩蛋,也就是可以修改Python的turtle指針外形。默認的指針就是一個小箭頭,我們可以通過t.shape("turtle"),將這個小箭頭改成一只真正的小烏龜,增加編程的趣味性。
但是,我們還可以進一步,來設定自己的指針外形,將指針改成我們希望的任何樣式,這一過程主要通過以下幾個方法的組合來實現:
t.begin_poly() # 開始繪制 # 繪制指針過程省略 t.end_poly() # 結束繪制 poly = t.get_poly() # 獲取繪制 t.register_shape("name", ploy) # 注冊一個名為"name"的shape newPoint = t.Pen() # 初始化一只新turtle newPoint.shape("name") # 讓這只turtle使用名為"name"的shape
可見,重點是turtle庫中提供了一個t.register_shape()方法,以供我們注冊自己的shape,有了這個方法,在特定的條件下,就可以極大的方便我們的程序設計。通過初始化出多只新turtle,可以同時在一個界面上以不同的shape繪圖。下面給出一段繪制實時時鐘的代碼,重點部分我已給出注釋。
#-*- coding:utf-8 –*- #用turtlr畫時鐘 #以自定義shape的方式實現 #當然,使用多只turtle來完全重繪的方法實現,也沒有問題。 #如果需要重繪方法的代碼,請加公眾號:see_goal 留言“turtle時鐘” import turtle as t import datetime as d def skip(step): # 抬筆,跳到一個地方 t.penup() t.forward(step) t.pendown() def drawClock(radius): # 畫表盤 t.speed(0) t.mode("logo") # 以Logo坐標、角度方式 t.hideturtle() t.pensize(7) t.home() # 回到圓點 for j in range(60): skip(radius) if (j % 5 == 0): t.forward(20) skip(-radius-20) else: t.dot(5) skip(-radius) t.right(6) def makePoint(pointName, len): # 鐘的指針,時針、分針、秒針 t.penup() t.home() t.begin_poly() t.back(0.1*len) t.forward(len*1.1) t.end_poly() poly = t.get_poly() t.register_shape(pointName, poly) # 注冊為一個shape def drawPoint(): # 畫指針 global hourPoint, minPoint, secPoint, fontWriter makePoint("hourPoint", 100) makePoint("minPoint", 120) makePoint("secPoint", 140) hourPoint = t.Pen() # 每個指針是一只新turtle hourPoint.shape("hourPoint") hourPoint.shapesize(1, 1, 6) minPoint = t.Pen() minPoint.shape("minPoint") minPoint.shapesize(1, 1, 4) secPoint = t.Pen() secPoint.shape("secPoint") secPoint.pencolor("red") fontWriter = t.Pen() fontWriter.pencolor("gray") fontWriter.hideturtle() def getWeekName(weekday): weekName = ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"] return weekName[weekday] def getDate(year, month, day): return "%s-%s-%s" % (year, month, day) def realTime(): curr = d.datetime.now() curr_year = curr.year curr_month = curr.month curr_day = curr.day curr_hour = curr.hour curr_minute = curr.minute curr_second = curr.second curr_weekday = curr.weekday() t.tracer(False) secPoint.setheading(360/60*curr_second) minPoint.setheading(360/60*curr_minute) hourPoint.setheading(360/12*curr_hour + 30/60*curr_minute) fontWriter.clear() fontWriter.home() fontWriter.penup() fontWriter.forward(80) # 用turtle寫文字 fontWriter.write(getWeekName(curr_weekday), align="center", font=("Courier", 14, "bold")) fontWriter.forward(-160) fontWriter.write(getDate(curr_year, curr_month, curr_day), align="center", font=("Courier", 14, "bold")) t.tracer(True) print(curr_second) t.ontimer(realTime, 100) # 每隔100毫秒調用一次realTime() def main(): t.tracer(False) drawClock(160) drawPoint() realTime() t.tracer(True) t.mainloop() if __name__ == "__main__": main()
運行這個例子,可以看到turtle在界面上實時展示出一個時鐘。我們重新編寫過的這段代碼還是比較簡潔,之前沒有介紹到的就是用turtle怎么輸出文字,詳細可以看例子中的write()方法。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/43012.html
摘要:比如把上面畫正方形的例子稍做變化重復執行次畫正方形開始畫正方形結束右轉度執行后,可以看到,畫出一個非常規整漂亮的組合圖案。 turtle圖形庫源于1966年誕生的Logo語言,是入門Python的有趣工具。因其簡單便捷的圖形化方法、和立即反饋式的繪畫效果,成為眾多編程入門者的首選。相對于大多數入門教材中枯燥的語法學習,和函數、方法的演練來說,turtle的趣味性顯得別具一格、極富效...
摘要:現實生活中,有很多圖形是非常有規律性的,這樣的圖形如果使用遞歸算法來實現,程序就會非常簡潔,運行效果也會很好。下面我們來用畫一棵樹,感受一下中的遞歸算法和的克隆功能。 前兩篇文章基本涵蓋了turtle的大部分功能,同時也借由對turtle功能的展示,厘清了Python的一些語法特點,以利于新手入門。但是短短幾個例子,闡述得還是有限,這里再展開兩個知識點,一方面對turtle做個補遺...
摘要:內置模塊繪圖詳解導入庫定義畫筆之后,后面命令要改為畫筆運動命令命令說明設置畫筆移動速度,畫筆繪制的速度范圍整數,數字越大越快設置畫筆的寬度向當前畫筆方向移動像素長度向當前畫筆相反方向移動像素長度順時針移動逆時針移動移動時繪制圖形,缺省時也為Python內置模塊turtle繪圖詳解導入turtle庫import turtlet=turtle(定義畫筆t之后,后面命令turtle要改為t)畫筆運...
摘要:基礎概念畫布畫布就是為我們展開用于繪圖區域我們可以設置它的大小和初始位置。常用的畫布方法有兩個和。設置畫筆的寬度沒有參數傳入返回當前畫筆顏色傳入參數設置畫筆顏色可以是字符串如也可以是元組。 Turtle庫是Python語言中一個很流行的繪制圖像的函數庫,想象一個小烏龜,在一個橫軸為x、縱軸為y的坐標系原點,(0,0)位置開始,它根據一組函數指令的控制,在這個平面坐標系中移動,從而在它爬...
閱讀 2935·2021-11-24 09:39
閱讀 3621·2021-11-22 13:54
閱讀 3421·2021-11-16 11:45
閱讀 2451·2021-09-09 09:33
閱讀 3207·2019-08-30 15:55
閱讀 1301·2019-08-29 15:40
閱讀 929·2019-08-29 15:19
閱讀 3408·2019-08-29 15:14