Python繪圖模塊?turtle案例代碼
turtle模塊概述
Python 標(biāo)準(zhǔn)庫中有個(gè) turtle 模塊,俗稱海龜繪圖,它提供了一些簡(jiǎn)單的繪圖工具,可以在標(biāo)準(zhǔn)的應(yīng)用程序窗口中繪制各種圖形。
turtle 的繪圖方式非常簡(jiǎn)單直觀,就像一只尾巴上蘸著顏料的小海龜在電腦屏幕上爬行,隨著它的移動(dòng)就能畫出線條來。使用海龜繪圖,我們只用幾行代碼就能夠創(chuàng)建出令人印象深刻的視覺效果,而且還可以跟隨海龜?shù)囊苿?dòng)軌跡,看到每行代碼是如何影響它的移動(dòng)的。
這能夠幫助我們更好地理解代碼的邏輯。所以海龜繪圖也經(jīng)常用作新手學(xué)習(xí) Python 的一種工具。
Turtle
turtle 是 Python 中自帶的繪圖模塊,最初來自于 Wally Feurzeig, Seymour Papert 和 Cynthia Solomon 于 1967 年所創(chuàng)造的 Logo 編程語言。
你可以使用 turtle 控制畫筆在畫板上畫畫。而這個(gè)畫筆是有形狀的,默認(rèn)是一個(gè)小箭頭,我們可以使用 turtle.shape(‘turtle’) 將其設(shè)成一個(gè)小海龜。除了變成小海龜外,還支持傳入:
- ‘arrow’(箭頭)
- ‘circle’(圓)
- ‘circle’(圓)
- ‘triangle’(三角形)
- ‘classic’(經(jīng)典)
默認(rèn)狀態(tài)下,我們的畫筆是落在畫板最中間的,并以此為原點(diǎn)形成了一個(gè)坐標(biāo)系,單位是像素。并且我們根據(jù)“上北下南左西右東”的慣例標(biāo)注四個(gè)方向。實(shí)際上這個(gè)坐標(biāo)系是不顯示的,但我們要知道小海龜實(shí)際上是在坐標(biāo)系內(nèi)移動(dòng)的。
小海龜頭的朝向是前方(默認(rèn)朝東),我們可以調(diào)用 turtle.forward(3) 讓小海龜前進(jìn) 3 像素,也就是小海龜移動(dòng)到了坐標(biāo)系中 (3, 0) 的位置。因?yàn)槲覀兊漠嫻P默認(rèn)是落下的,因此在移動(dòng)的過程中會(huì)留下一道軌跡,即一條長(zhǎng) 3 像素的直線。
除了前進(jìn)之外,當(dāng)然也有后退。調(diào)用 turtle.backward(3) 即可讓小海龜向后倒退 3 像素,移動(dòng)到坐標(biāo)系中 (-3, 0) 的位置,同樣也會(huì)留下一條長(zhǎng) 3 像素的直線。
注意:后退后小海龜?shù)某蚴遣蛔兊摹?/p>
畫筆的顏色默認(rèn)是黑色的,我們可以使用 turtle.color(‘red’) 改成紅色的。當(dāng)然,你也可以使用 turtle.color(‘yellow’) 改成黃色,使用 turtle.color(‘pink’) 改成粉色等等。
除了使用顏色的英文外,我們還能傳入 16 進(jìn)制的 RGB 色值。RGB 色值能表示出 1600 多萬種顏色,比如 #000000 表示黑色,#FFFFFF 表示白色,#FF0000 表示紅色等。
現(xiàn)在我們嘗試用小烏龜畫一個(gè)100像素長(zhǎng)的直線
import turtle turtle.shape('turtle') turtle.color('brown') turtle.backward(100) # turtle.forward(100) turtle.done()
結(jié)果:
注意點(diǎn):
①這個(gè)地方前進(jìn)后退都可以
②畫完圖之后一定記得要turtle.done(),否則程序在畫完之后會(huì)立即退出,你會(huì)看不到結(jié)果,造成一種閃退的假象。
讓小海龜轉(zhuǎn)彎
轉(zhuǎn)彎其實(shí)很簡(jiǎn)單,分為左轉(zhuǎn)和右轉(zhuǎn)。
- 左轉(zhuǎn)是 turtle.left()
- 右轉(zhuǎn)是 turtle.right()
它倆的參數(shù)是角度,比如 turtle.right(90) 表示右轉(zhuǎn) 90 度。同理,turtle.left(90) 表示左轉(zhuǎn) 90 度。
轉(zhuǎn)向后,小海龜?shù)某蚓妥兞?。再調(diào)用 turtle.forward() 會(huì)朝著轉(zhuǎn)向后小海龜頭指著的方向前進(jìn)。
我們可以試著畫一個(gè)正方形:
import turtle turtle.forward(100) turtle.right(90) turtle.forward(100) turtle.right(90) turtle.forward(100) turtle.right(90) turtle.forward(100) turtle.right(90) #簡(jiǎn)化一下 import turtle for i in range(4): turtle.forward(100) turtle.right(90)
結(jié)果:
turtle.left() 和 turtle.right() 每次轉(zhuǎn)向都是根據(jù)當(dāng)前朝向來轉(zhuǎn)的,當(dāng)多次轉(zhuǎn)向后你可能就不知道現(xiàn)在朝向哪了。因此,我們還可以使用 turtle.setheading()
來直接設(shè)置朝向。turtle.setheading() 的參數(shù)也是角度,只是這個(gè)角度對(duì)應(yīng)的朝向是固定的。具體對(duì)應(yīng)方式如下圖所示:
因此,我們可以直接調(diào)用 turtle.setheading(0) 讓小海龜朝東,調(diào)用 turtle.setheading(180) 讓小海龜朝西。當(dāng)然,0 到 360 度之間的角度都是可以的,調(diào)用 turtle.setheading(45) 可以讓小海龜朝向東北方向。
之前顯示小海龜是為了方便理解朝向,現(xiàn)在弄清楚了朝向我們就可以將小海龜隱藏了。隱藏小海龜可以加快繪圖的速度,并且最后畫出的圖上也不會(huì)有個(gè)小海龜影響畫風(fēng)。
要隱藏小海龜非常的簡(jiǎn)單,只要調(diào)用 turtle.hideturtle()
即可。當(dāng)你想再次顯示小海龜時(shí),調(diào)用 turtle.showturtle()
即可。
畫一顆五角星
五角星每個(gè)角的度數(shù)都是 36 度,用 180 - 36 得到對(duì)應(yīng)的補(bǔ)角為 144 度。如下圖所示:
五角星的五條線的長(zhǎng)度是一樣的,并且角度也一樣。那么,我們就可以用循環(huán)來畫五角星。五角星要畫 5 條線,因此要循環(huán) 5 次。每次循環(huán)都除了畫一條線,還要旋轉(zhuǎn)特定的角度。從上圖可知,每次向右旋轉(zhuǎn) 144 度即可。所以畫五角星的代碼如下:
import turtle turtle.color('red') turtle.hideturtle() for i in range(5): turtle.forward(100) turtle.right(144)
結(jié)果:
在這個(gè)基礎(chǔ)上我們還可以給五角星上色。
相關(guān)方法:
①turtle.color() 會(huì)將畫筆顏色和填充顏色都設(shè)置成一個(gè)
②turtle.fillcolor() 能單獨(dú)設(shè)置填充顏色
③turtle.pencolor() 單獨(dú)設(shè)置畫筆顏色
④turtle.begin_fill() 開始填充
⑤turtle.end_fill() 結(jié)束填充
我們只要在畫五角星之前調(diào)用 turtle.begin_fill(),在畫完五角星之后調(diào)用 turtle.end_fill(),我們畫的五角星就會(huì)被填充上我們?cè)O(shè)置好的顏色了。
import turtle turtle.color('red') turtle.hideturtle() turtle.begin_fill() # 開始填充 for i in range(5): turtle.forward(100) turtle.right(144) turtle.end_fill() # 結(jié)束填充
結(jié)果:
移動(dòng)五角星
你可能已經(jīng)發(fā)現(xiàn)了,這顆五角星有些“歪”,不在畫板的正中間。如果我們腦補(bǔ)出坐標(biāo)系的話,我們的五角星處于的位置其實(shí)是下面這樣的:
因此,我們需要將我們的五角星先左移再上移,讓五角星處于坐標(biāo)系的中間,就像下面這樣:
我們做不到直接移動(dòng)五角星,但我們可以移動(dòng)畫筆的初始位置。只要將畫筆的初始位置往左上方移動(dòng)一點(diǎn),這樣我們的五角星就處于坐標(biāo)系的最中間了。上圖中畫筆的初始位置在坐標(biāo)系中大概是 (-50 ,20),我們可以調(diào)用 turtle.goto(-50, 20) 來移動(dòng)畫筆的位置。
turtle.goto(x, y)
將畫筆移動(dòng)到指定位置
第一個(gè)參數(shù)是 x 軸的坐標(biāo),第二個(gè)參數(shù)是 y 軸的坐標(biāo)。
但直接移動(dòng)畫筆位置是有問題的,因?yàn)槲覀兊漠嫻P一直處于落下的狀態(tài),移動(dòng)的過程中也會(huì)畫出一條直線。我們可以調(diào)用 turtle.penup()
將畫筆抬起,這樣移動(dòng)的過程中就不會(huì)畫線。等需要時(shí)再調(diào)用 turtle.pendown()
將畫筆落下開始繪圖。
turtle.penup() 將畫筆抬起
turtle.pendown() 將畫筆落下
所以,將邊長(zhǎng)為 100 像素的五角星移動(dòng)坐標(biāo)系中央的完整代碼如下:
import turtle turtle.color('red') turtle.hideturtle() turtle.penup() turtle.goto(-50, 20) turtle.pendown() turtle.begin_fill() for i in range(5): turtle.forward(100) turtle.right(144) turtle.end_fill()
#一閃一閃亮晶晶
我們還可以畫一堆星星,實(shí)現(xiàn)“一閃一閃亮晶晶,滿天都是小星星”的效果~?
因?yàn)楫嫷男切潜容^多,我們先把之前畫五角星的代碼封裝成一個(gè)函數(shù):
import turtle def draw_star(): turtle.color('white') turtle.hideturtle() turtle.begin_fill() for i in range(5): turtle.forward(10) turtle.right(144) turtle.end_fill()
星星的光是白色的,因此我將顏色設(shè)置成了白色(white)。并且,因?yàn)槭切⌒切?,我將邊長(zhǎng)設(shè)成了 10 像素。畫一個(gè)小星星的方法搞定了,接下來是畫滿天星,就畫 50 個(gè)吧!滿天星的位置都是隨機(jī)的,我們需要用到 random 模塊生成隨機(jī)位置。
隨機(jī)畫 50 顆小星星的代碼如下:
import turtle from random import randint def draw_star(): turtle.color('white') turtle.hideturtle() turtle.begin_fill() for i in range(5): turtle.forward(10) turtle.right(144) turtle.end_fill() for i in range(50): turtle.speed(0) # 最快速 turtle.penup() x = randint(-150, 150) # x 軸 y = randint(-100, 100) # y 軸 turtle.goto(x, y) turtle.pendown() draw_star()
上述代碼涉及的方法:
①turtle.speed(x)
控制繪圖速度
turtle.speed(x) 的參數(shù)是 0-10 的整數(shù),其中 1-10 數(shù)字越大,繪圖速度越快。1 最慢,10 最快,默認(rèn)是 6。而 0 表示沒有動(dòng)畫效果,因此 0 比 10 的速度還要快。
②turtle.write()
在畫板上寫字
參數(shù)為要寫的內(nèi)容。我們還能設(shè)置字的字體、大小等,比如turtle.write(‘By CSDN’, font = (‘SimHei’, 12, ‘bold’)),font 參數(shù)是個(gè)元組,其中第一個(gè)是字體,第二個(gè)是字體大小,最后一個(gè)是字重。
完整代碼:
import turtle from random import randint def draw_star(): turtle.color('black') turtle.hideturtle() turtle.begin_fill() for i in range(5): turtle.forward(10) turtle.right(144) turtle.end_fill() for i in range(50): turtle.speed(0) turtle.penup() x = randint(-150, 150) y = randint(-100, 100) turtle.goto(x, y) turtle.pendown() draw_star() turtle.penup() turtle.goto(0, -130) turtle.pendown() turtle.write('By CSDN', font = ('SimHei', 12, 'bold'))
結(jié)果:
到此這篇關(guān)于Python繪圖模塊 turtle案例代碼的文章就介紹到這了,更多相關(guān)Python繪圖模塊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python中實(shí)現(xiàn)指定時(shí)間調(diào)用函數(shù)示例代碼
函數(shù)function是python編程核心內(nèi)容之一,也是比較重要的一塊。下面這篇文章主要給大家介紹了關(guān)于python中實(shí)現(xiàn)指定時(shí)間調(diào)用函數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。2017-09-09Python使用海龜繪圖實(shí)現(xiàn)貪吃蛇游戲
這篇文章主要為大家詳細(xì)介紹了Python使用海龜繪圖實(shí)現(xiàn)貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06總結(jié)Python變量的相關(guān)知識(shí)
今天給大家?guī)淼氖顷P(guān)于Python基礎(chǔ)的相關(guān)知識(shí),文章圍繞著Python變量的相關(guān)知識(shí)展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06Python OpenGL繪制一場(chǎng)煙花盛會(huì)
正值新春佳節(jié),小編今天為大家?guī)砹擞肞ython OpenGL繪制的一場(chǎng)煙花盛會(huì),文中的實(shí)現(xiàn)步驟講解詳細(xì),感興趣的小伙伴可以跟隨小編一起動(dòng)手試一試2022-02-02Python requests及aiohttp速度對(duì)比代碼實(shí)例
這篇文章主要介紹了Python requests及aiohttp速度對(duì)比代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07Selenium(Python web測(cè)試工具)基本用法詳解
這篇文章主要介紹了Selenium(Python web測(cè)試工具)基本用法,結(jié)合實(shí)例形式分析了Selenium的基本安裝、簡(jiǎn)單使用方法及相關(guān)操作技巧,需要的朋友可以參考下2018-08-08Python檢查和同步本地時(shí)間(北京時(shí)間)的實(shí)現(xiàn)方法
這篇文章主要介紹了Python檢查和同步本地時(shí)間(北京時(shí)間)的實(shí)現(xiàn)方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-12-12