相信有不少人學習python 都是聽了老前輩的推薦
“學python好,python有趣的代碼多”
比如說畫一只小獅子

這就是今天想要介紹的繪制圖形庫-turtle
如果也想這樣畫一只小獅子,或者其他的小動物那就趕緊點贊收藏學起來吧

一、什么是turtle庫
turtle庫是python的基礎繪圖庫
這個庫被介紹為一個最常用的用來給孩子們介紹編程知識的方法庫,
其主要是用於程序設計入門,是標准庫之一,利用turtle可以制作很多復雜的繪圖。
簡單理解turtle庫就是一個用於圖形繪制的基礎庫。
可能剛剛就有人有疑問,為什么繪畫庫不叫painting,而叫turtle?這就不得不說turtle庫的思想。
在畫布上,默認有一個坐標原點為畫布中心的坐標軸,坐標原點上有一只面朝x軸正方向小烏龜。

二、有哪些函數?
1.畫布
既然說turtle是一個繪圖庫,那么怎么能不說畫布呢?
畫布函數有兩個
第一個為screensize()其中包含三個參數,它們分別為
canvwidth=None,畫布的長度
canvheight=None,畫布的寬度
bg=None,畫布的背景色
畫布是必不可少的,為防止有些粗心鬼忘設定,所以默認無設定時為一個400*300的白畫布
第二個為setup(),有四個參數
width、height兩者表示為畫布的長與寬,當傳參為整數時,表示像素長度單位,當傳參為小數時,表示與屏幕的比例
starX,starY則表示一組坐標值,坐標表示畫布左上角的位置,若為空則默認為屏幕中心
兩個函數各有優劣,screensize()可以設定背景色,setup可以設定位置,如下圖所比較
import turtle turtle.screensize(400,300,"green") turtle.done()

import turtle turtle.setup(600,400,100,100) turtle.done();

2.畫筆
turtle繪圖中,就是使用位置方向描述小烏龜(畫筆)的狀態。
所以畫筆一共有三個基礎屬性函數,分別為
turtle.pensize():設置畫筆的寬度;
turtle.pencolor(); 設置畫筆的顏色,顏色采用RGB,也可以直接輸入對應顏色如“red”,若無參數時,采用當前顏色,
turtle.speed(); 設置畫筆的速度,從1`10,數字越大則速度越快。
代碼如下設定
import turtle turtle.pensize(5) turtle.pencolor("green") turtle.forward(100) turtle.done();

3.操作
操作可就相對來說多了一些,這里也只簡單羅列幾種常用的
(1)畫筆運動命令
pendown()與penup()這兩個函數可是哥倆,一目了然的意思,一個負責抬起畫筆,一個負責落下畫筆
表示畫筆狀態的轉換,自然也就不需要傳參數進入了
forword()函數用來控制畫筆向正方向移動(正方向默認為東)
有向正方向,自然就有負方向函數backward()
還有就是goto函數,就像直譯,表示將畫筆移動到坐標軸的某處,goto傳參數為坐標信息
就像剛剛介紹的那樣,turtle使用的為極坐標方式,參數為方向與長度
所以left與right表示為順時針與逆時針,傳入參數為角度

(2)畫筆控制命令
畫筆控制命令相對來說比較少,主要操作便是填充
turtle.fillcolor(colorstring) 繪制圖形的填充顏色
turtle.begin_fill()准備開始填充圖形
turtle.end_fill() 填充完成
(3) 全局控制命令
turtle.clear() 清除窗口繪制圖形
turtle.undo() 撤銷上一個turtle動作
還有更多指令沒有那么常見,便將它放在文章末尾,還往各位看客收藏之后記得幫我點個贊

接下來我們開始實戰練習_畫小獅子
從效果圖中,我們可以看出,首先繪制的為小獅子的頭發
那么我們先定義頭發函數 def hair()
很明顯畫筆的起始位置不在畫布中央,在(-50,150)處
這時候我們應當怎么辦?自然是移動過去畫筆
怎么移動畫筆?這里兩種方式都可以
第一種 偏轉角度,在先前移動
turtle.left()+turtle.forward()
但是這種方法需要知道角度和長短,相對來說不是很好算 tan α = -3,l^2=(-50)^2+(150)^2
第二種 直接到達目的地
就是通過goto函數直接到達(-50,150)比較簡單直接
需要注意的是,畫筆直接過去會留下“畫筆的印記”
所以應該先 抬起畫筆,移動過去,再落下畫筆

如圖所示,小獅子的頭發為10個同等的弧組成,這就需要用到for循環語句與circle()函數 setheading();
circle()函數為畫圓而准備,需要傳入半徑,若為圓弧則還需要加入角度參數,當參數為正時從畫筆左側半徑處開始順時針畫,當參數為負時從右側開始逆時針畫
需要注意的是要想讓多個半圓圍成,需要不斷修改正方向,十個圓弧,所以每次需要偏轉360/10,設計代碼如下所示
def hair(): t.penup() t.goto(-50, 150) t.pendown() t.fillcolor('#a2774d') t.begin_fill() for j in range(10): t.setheading(60 - (j * 36)) t.circle(-50, 120) t.end_fill()
有了畫頭發的經驗,畫臉相對來說好理解了不少
臉部有哪些,眼睛,鼻子,嘴巴,耳朵,下巴。
其中眼睛,耳朵為相互對稱的部分,所以可以單獨拿出來,組成函數,到時候傳參數只要分別傳1與-1兩個相反數即可保證畫的對稱和諧。
按照效果圖的順序開始,畫完頭發后該畫耳朵,之后開始重復工作,抬起畫筆,移動到指定位置,設計如何繪畫,記得填充狀態和畫筆的起落狀態。

最后送上代碼如下,和turtle工具圖。希望各位大佬喜歡,加個關注。
(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() |
返回最后記錄的多邊形。
|
小獅子代碼如下
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): t.setheading(60 - (j * 36)) t.circle(-50, 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): 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): 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()
本篇博客重點在介紹各個函數,若小獅子繪制仍然有問題,可以留言,有需要可以做一期專門的博客。
謝謝觀看
