python庫之turtle(圖形繪制) 開啟新的快樂源泉


相信有不少人學習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()

啟動事件循環 -調用Tkintermainloop函數。

必須是烏龜圖形程序中的最后一個語句。

turtle.mode(mode=None)

設置烏龜模式(“standard”“logo”“world”)並執行重置。如果沒有給出模式,則返回當前模式。

模式

初始龜標題

正角度

standard

向右(東)

逆時針

logo

向上(北)

順時針

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()

 

 本篇博客重點在介紹各個函數,若小獅子繪制仍然有問題,可以留言,有需要可以做一期專門的博客。

謝謝觀看

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM