python中的画布背景设置_教你用python画图—Turtle详细教程
Turtle模塊絕對是吸引非專業代碼開發者人員學習python入門的好工具
通過turtle幾行代碼的執行軟件就會畫出漂亮的圖形,美觀而且有成就感,這樣一下子對python編程就產生了興趣。
這些漂亮的圖形如三角形、五角星、機器貓等。在寫代碼的時候改變幾個參數,就可以產生新的奇形怪狀。下面我就以玩轉Turtle為題進入本篇的介紹。
/??什么是Turtle?/
Turtle英譯過來為烏龜,不過我們介紹的不是這種動物,而是以此命名的一個繪圖軟件。在python文檔中介紹了Turtle本身是一款簡單、易上手的繪圖軟件,非常適合新手進入編程的世界。
該軟件由Wally Feurzeig, Seymour Papert and Cynthia Solomon等在1967年使用最原始的Logo編程語言開發而成。python語言出現后,有開發者使用python對其進行了重寫,變成了Python內置的一個模塊。
隨著python語言的大熱,Turtle模塊也成為了python語言簡單好用的一個代名詞,或者說一個很好的宣講案例。在Python中,使用turtle模塊的幾行代碼、改變幾個參數就能繪出漂亮的圖形,如果再增加一些參數,還能繪制出如笑臉、哆啦A夢、表情包等創意十足的圖像,令人驚嘆。
在學著繪圖時,就會逐步學習python的一些基本語法、函數、模塊、類和對象等基礎知識;邊玩邊學四字成語非常恰當的描述了玩轉turtle模塊的境界,也非常適宜于少兒或者初學者進入Python的世界。
/??怎么玩轉Turtle?/
當然在這里需要進入python編程環境,可以直接使用IDLE新建一個python文件,命名為turtle1.py。然后在這個python文件中就可以開始動手寫有關turtle的代碼。
Turtle是python安裝時自帶的內置模塊,調用該模塊非常簡單,直接使用import方式加載:
import turtle這也是程序的第一行代碼,用于準備好使用turtle這個模塊。
(1)基本動作和轉向
然后就可以開始學步了。首先從走開始,讓烏龜往前走100步,就在第一行代碼結束后在第二行代碼處寫入:
turtle.forward(100)這里forward就是往前走的方法,括號里的100為設定的步伐參數。
此時如果運行該程序,就可以看到一張畫布彈出來,該畫布左上角有Python Turtle Graphics標題和LOGO,在畫布的中部黑三角箭頭正按照較快的速度往前挪,很快到達100步那個位置。
前進的過程就像一支黑色的筆在畫布上按照設定方式在畫畫,筆頭安裝了一個黑色箭頭用于指示方向,非常生動有趣。如下圖:
而此時代碼看起來是這樣的:
如果想往前走300步,直接修改那個100為新的300即可。
即對于forward(參數)方法,括號里的參數是可以修改的,這在python程序里forward就是一個公用函數,其中的參數為變量,即值可以改變的參數。控制了這個參數,就可以控制前進的距離。
如果想回撤,那么就可以使用烏龜的backward方法。如在上述代碼第三行加入回撤50步的代碼,如下:
import turtleturtle.forward(100)turtle.backward(50)保存新的文件同時運行,可以看到畫布上畫筆的黑三角箭頭保持方向不變,但倒著往回50步。如圖:
上述forward和backward就是前進和后退的方法,兩種方法都有括號,在括號里可以設定前進或后退的步伐(這里一步為畫布上的一個像素點)。
只有前進和后退顯然有點單調,我們需要還可以轉彎。此時就需要使用turtle的轉向方法,左轉為left,右轉為right,如下我們在前述代碼基礎上增加左轉方法,并設定角度為90度,然后繼續往前100步。
import turtleturtle.forward(100)turtle.backward(50)turtle.left(90)turtle.forward(100)運行程序后,畫布上畫筆先是筆頭左轉了90度方向,變成了向上,然后沿著向上的方法畫出了長度為100像素的一條線,此時圖形變成了一個倒丁字形狀:
上述代碼中left方法與forward方法一樣,括號里的參數也可以隨意設定,比如將left方法里的90度修改為45度:
import turtleturtle.forward(100)turtle.backward(50)turtle.left(45)turtle.forward(100)再運行程序,此時圖形就變為一個鈍角形狀:
由此看來,改變left方法里的角度參數,畫筆就可以繪制出不同形狀的圖形。
與左轉left方法使用方法一致,右轉right方法用于向右轉,其中right(角度)中的角度參數也可以根據需要來設置。例如在上述左轉前行的基礎上,設定右轉90度,然后前行100步:
import turtleturtle.forward(100)turtle.backward(50)turtle.left(45)turtle.forward(100)turtle.right(90)turtle.forward(100)運行代碼時,繪制圖形效果如下:
接下來可以思考一下,如果在上述基礎上將右側下部開口的三角形狀進行封閉,也就是形成一個完整的三角形呢?
很顯然,此時需要動腦筋稍微計算一下。首先箭頭需要右轉135度,然后再前行100步:
import turtleturtle.forward(100)turtle.backward(50)turtle.left(45)turtle.forward(100)turtle.right(90)turtle.forward(100)turtle.right(135)turtle.forward(100)再次運行程序,畫筆先在原有位置順時針方向旋轉135度,筆頭方向正好朝西,然后開始畫一個長為100像素的直線,就得到一個右側封閉的三角形,如下:
到這里我們小結一下,使用turtle繪圖的基本動作方法包括:forward(前進參數)、backward(后退參數)、left(左轉角度)、right(右轉角度)。turtle是烏龜繪圖模塊名,該模塊中內置了這些動作方法,因此在使用的時候直接調用并給定相應參數即可。簡單理解,turtle就是那支畫筆,這些基本動作方法就用于控制畫筆的畫畫方式。用python的面向對象概念來理解,這些方法屬于turtle這個繪圖對象,調用時使用了“.”運算符,其格式為turtle.方法名(參數)。turtle這個繪圖對象還有很多類似方法,使用格式均為turtle.方法名(參數)。
(2)設置畫布和畫筆顏色
試想我們是否可以設置一下畫布和畫筆的顏色呢?肯定是可以的,調用畫筆的bgcolor方法就可以設置畫布背景顏色,格式為:turtle.bgcolor(顏色參數);調用其color方法就可以設置畫筆顏色,格式為turtle.color(顏色參數)。這里的顏色參數直接給常見的顏色,如red、white、yellow、purple,使用的時候加單引號;也可以給RGB顏色代碼,如255,255,255為白色,0,0,0為黑色。需要說明的是,設置畫布背景顏色一般會放置在程序開始部分,而畫筆顏色可以在需要的地方設置即可。如將上述繪制三角形的代碼修改一下,增加畫布背景和畫筆顏色:
import turtleturtle.bgcolor('black')turtle.color('yellow')turtle.forward(100)turtle.backward(50)turtle.left(45)turtle.color('white')turtle.forward(100)turtle.right(90)turtle.forward(100)turtle.color('red')turtle.right(135)turtle.forward(100)運行代碼,此時畫布變為了黑色,畫筆先為黃色,然后為白色,最后為紅色,效果如下:
上面我們通過控制turtle畫筆的動作和轉向角度,畫出了一個三角形。想想心里是不是已經有了小小的成就感了?看來用turtle軟件畫畫還是比較簡單的。
(3)for循環語句控制重復動作
下面我們來在畫布上畫一個正方形。如何設計呢?首先來分析一下,我們知道正方形每條邊長度相同,邊與邊的夾角為90度。因此可以先往前移動一個距離d,然后左轉90度,轉向后繼續往前移動距離d,再左轉90度,繼續移動距離d,再來一次左轉90度,移動距離d,這樣起點和終點就重合了,也就畫出了一個完整的正方形。我們來看代碼:
import turtleturtle.bgcolor('black')
turtle.color('yellow')
turtle.forward(100)
turtle.left(90)
turtle.forward(100)
turtle.left(90)
turtle.forward(100)
turtle.left(90)
turtle.forward(100)
turtle.left(90)
執行后,畫筆就在畫布上畫出了一個正方形:
仔細觀察代碼,可以發現如果把turtle.forward(100)、turtle.left(90)這兩行語句作為一個動作組合的話,整個代碼中一共重復了四次,這種重復動作寫在代碼中還是有點冗長的,試想如果重復100次這個組合動作,那就得將這個組合動作代碼重復編寫100次,這樣做肯定不科學。如何簡化這種重復執行動作組合呢?python中提供了控制循環的for語句,專門用于解決這類重復性問題。我們先來修改一下畫正方形的代碼:
import turtleturtle.bgcolor('black')turtle.color('yellow')totalTimes=4 #設定一共需要重復的次數for times in range(totalTimes): #使用for語句對每一次進行設計相同的動作組合 turtle.forward(100) #設定前移100個像素點 turtle.left(90) #然后左轉90度執行后效果與上述圖是一樣的。這里代碼就簡化多了,代碼中for語句就用于設計循環語句,其使用方法為:
for times in range(totalTimes): #這里寫需要重復的代碼塊。上述畫四邊形時,相同動作組合重復了4次,動作組合中轉向角度為90度,兩個數字相乘正好為360度,從角度來說就是從起始點出發旋轉一周回到原點,也恰好構成一個封閉的圖形。
如果還想畫一個封閉的五邊形,就可以設計動作組合中轉向角度為72度,重復次數為5次;如果畫一個封閉的六邊形,設計轉向角度為60度,重復次數為6次即可。如下設計在畫布上先畫五邊形,然后畫六邊形的代碼:
import turtleturtle.bgcolor('black')turtle.color('yellow')#先畫6邊形totalTimes=6for times in range(totalTimes): turtle.forward(100) turtle.left(60)#然后左轉向150度,并往前移動50個像素點turtle.left(150)turtle.forward(50)#最后畫5邊形totalTimes=5for times in range(totalTimes): turtle.forward(100) turtle.left(72)執行上述代碼,在畫布上畫出的效果是這樣的:
這樣是不是就可以畫一個圓呢?只要將畫筆移動的距離設置短一些,如設置為2,轉向設置也為2,那重復次數就必須設置為180,由此就可以畫出一個妥妥的圓了。代碼如下:
import turtleturtle.bgcolor('black')turtle.color('yellow')#畫圓totalTimes=180for times in range(totalTimes): turtle.forward(2) turtle.left(2)執行后效果如下:
不過在turtle軟件中已經內置好了畫圓的方法,就是使用turtle.circle(半徑參數),給定半徑參數就能完成圓的繪制。如下代碼:
import turtleturtle.bgcolor('black')turtle.color('yellow')#畫一個半徑為100的圓turtle.circle(100)(4)設置坐標和畫筆位置
到現在為止,我們已經掌握了畫基本圖形的方法。不過仔細觀察的話也可以發現每次畫畫時畫筆總是從畫布的中心出發,因為這是turtle模塊設置好了的,默認從中心點出發。
如果使用二維坐標來表示的話,畫布的中心位置坐標為(0,0),即縱橫坐標均為0。
我們也可以使用turtle模塊的setpos方法修改其位置,如turtle.setpos(10,10)就是設置畫筆縱坐標為10,橫坐標也為10;如若設置為turtle.setpos(10,10),就是設置畫筆橫坐標為10,也就是中心點往右10個像素點,然后再往上10個像素點。
如果用數學角度來說明的話,新的起始點就在中心點右偏上45度,距離為d=(10*10+10*10)的平方根。
我們來試一下:
import turtleturtle.bgcolor('black')turtle.color('yellow')#畫筆默認在畫布的中心位置,坐標為(0,0)#設置畫筆的位置挪到縱橫坐標均為10像素的位置,即中心點往右45度方向turtle.setpos(10,10) #開始畫圓,畫一個半徑為100像素的圓turtle.circle(100)運行程序后,畫筆先從中心位置挪到指定位置(10,10),然后開始畫圓,效果圖如下:
這個圓畫的不漂亮,起始點貌似有個尾巴,這是畫筆最開始從中心位置挪到設定位置時畫筆移動的痕跡。
如何去除這個痕跡呢?
我們可以這樣做:使用turtle提供的提筆方法penup( ),也就是先從中心點將畫筆提起來,畫筆在空中挪至設定位置,然后到了設定位置再將畫筆落到畫布上,此時就使用落筆方法turtle.pendown( ),這樣我們修改上述代碼如下:
import turtleturtle.bgcolor('black')turtle.color('yellow')#提起畫筆turtle.penup()#設置畫筆的位置挪到縱橫坐標均為10像素的位置,即中心點往右45度方向turtle.setpos(10,10)#落下畫筆turtle.pendown()#開始畫圓,畫一個半徑為100像素的圓turtle.circle(30)再來執行代碼,那個多余的尾巴就沒有了。
同時如果想畫圖結束時那個畫筆不顯示,可以使用hideturtle方法,即隱藏畫筆。
由此可以得到啟發,使用提筆落筆的方法我們就可以在同一個畫布上畫出很多圖形,當然前提是需要計算好位置。由此設計的時候可以先用筆參考如下坐標圖給定位置:
例如我們來畫個笑臉試試。
import turtleturtle.bgcolor('black')turtle.color('yellow')#先畫笑臉輪廓,畫一個半徑為100像素的圓turtle.circle(100)#提筆到左上角(-40,120)位置,畫一個小圓,表示右眼turtle.penup()turtle.setpos(-40,120)turtle.pendown()turtle.circle(10)#提筆到中部位置,先畫一條短線表示上嘴唇turtle.penup()turtle.setpos(-10,60)turtle.pendown()turtle.forward(20)#繼續下移一定距離,畫一條短弧線表示下嘴唇turtle.penup()turtle.setpos(-10,40)turtle.pendown()totalTimes=4for times in range(totalTimes): turtle.forward(5) turtle.left(10)#提筆到右上角(40,120)位置,畫一個小圓,表示右眼turtle.penup()turtle.setpos(40,120)turtle.pendown()turtle.circle(10)#隱藏那個畫筆箭頭turtle.hideturtle()運行效果如下圖:
實話實說美觀程度一般,不過至少畫出了一個小人的臉,好像不咋笑。我們使用了turtle.penup()方法,就是提筆,而turtle模塊中本身就自帶了pen方法,也就是畫筆方法,
可以通過pen方法來設置畫筆的尺寸、顏色,也可以直接使用pencolor、pensize等方法。
具體使用格式為:
turtle.pen(pensize=10,pencolor='red',fillcolor='yellow')或者直接設定:
turtle.pencolor('red')turtle.pensize(10)如果需要填充顏色,就需要使用turtle的beginfill()和end_fill() 組合,格式為:
turtle.fillcolor("yellow")turtle.begin_fill()turtle.circle(100)turtle.end_fill()我們將這些顏色的設定加入之前畫的那個笑臉代碼中:
import turtleturtle.bgcolor('black')turtle.color('yellow')#先畫笑臉輪廓,畫一個半徑為100像素的圓turtle.fillcolor("yellow")turtle.begin_fill()turtle.circle(100)turtle.end_fill()#提筆到左上角(-40,120)位置,畫一個小圓,表示右眼turtle.pen(pensize=10,pencolor='red',fillcolor='yellow')turtle.penup()turtle.setpos(-40,120)turtle.pendown()turtle.circle(10)#提筆到中部位置,先畫一條短線表示上嘴唇turtle.penup()turtle.setpos(-10,60)turtle.pendown()turtle.forward(20)#繼續下移一定距離,畫一條短弧線表示下嘴唇turtle.penup()turtle.setpos(-10,40)turtle.pendown()totalTimes=4for times in range(totalTimes): turtle.forward(5) turtle.left(10)#提筆到右上角(40,120)位置,畫一個小圓,表示右眼turtle.pen(pensize=10,pencolor='red',fillcolor='yellow')turtle.penup()turtle.setpos(40,120)turtle.pendown()turtle.circle(10)#隱藏那個畫筆箭頭turtle.hideturtle()再運行代碼,就得到效果圖如下:
我們來畫一個小車,在畫的時候先需要在紙上稍微設計一下車的基本結構參數,如長度和高度等等。示例代碼如下:
import turtleturtle.bgcolor('black')turtle.color('yellow')#先畫后輪子turtle.fillcolor("yellow")turtle.begin_fill()turtle.circle(20)turtle.end_fill()#提筆往前挪,畫前輪turtle.penup()turtle.forward(200)turtle.pendown()turtle.begin_fill()turtle.circle(20)turtle.end_fill()#畫車輪廓turtle.left(90)turtle.forward(50)turtle.right(90)turtle.forward(70)turtle.left(135)turtle.forward(60)turtle.right(45)turtle.forward(2)turtle.left(90)turtle.forward(70)turtle.right(90)turtle.forward(20)turtle.left(90)turtle.forward(160)turtle.left(50)turtle.forward(60)turtle.left(40)turtle.forward(18)turtle.left(90)turtle.forward(240)#畫后輪與車輪廓接觸線turtle.penup()turtle.home()turtle.pendown()turtle.left(90)turtle.forward(50)turtle.write("this car is made by Mr.cao,2019")#車上方寫標題turtle.penup()turtle.setpos(60,140)turtle.pendown()turtle.write("豪車!",font=("Times", 18, "bold"))#隱藏那個畫筆箭頭turtle.hideturtle()運行效果如圖:
(5)使用函數
還想畫別的嗎?只要有足夠的想象力,大部分的圖都可以使用這個turtle來實現。那我們在畫的過程中每完成一個圖形,是否可以將這個畫圖形的過程包裝起來給個名字,如果想畫這個圖形,直接調用它的名字就可以呢。肯定是可以的,而且還非常方便。python中的函數就是用來做這個事情的,其基本格式為:
def 函數名稱(參數): #執行代碼如果以畫畫為例,函數名稱就可以命名為畫圖形名稱,這里的參數是可選項,在畫畫過程中如果想采用不同顏色的筆,就可以將筆的顏色作為一個參數變量,每次使用這個函數時給定筆的顏色參數,就可以按照自己喜歡的顏色畫畫了。也可以將別的可以變化的參數作為變量參數來設定。
執行代碼處就是代碼塊,用于完成整個圖形繪制的過程。舉個栗子,我們將前面畫四邊形、五邊形、六邊形等可以包裝成一個函數,名稱取為drawShape,參數包括兩個,一個是totalTimes,總的邊數,一個是distance,就是畫畫長度,代碼如下:
def drawShape(totalTimes,distance): for time in range(totalTimes): turtle.forward(distance) turtle.left(360/totalTimes)這樣我們想畫這種類似形狀的時候,只需要調用這個函數名,給定兩個參數的值,就可以了。例如:
import turtleturtle.bgcolor('black')turtle.color('yellow')#編寫一個函數drawShape,用于畫多邊形def drawShape(totalTimes,distance): for time in range(totalTimes): turtle.forward(distance) turtle.left(360/totalTimes) #調用這個函數,來畫一個五邊形,每邊長度為80個像素drawShape(5,80)(6)turtle時鐘和事件響應
在turtle中還有動作觸發響應事件,也就是通過鼠標或鍵盤來控制畫畫開始或結束,還可以設置時鐘,這樣我們就可以畫點動畫了,當然是較為簡單的。例如我們將上述畫笑臉和畫車兩個作品放在一個文件里,先畫笑臉,等待2秒后,再畫出車來,代碼參考如下:
import turtleturtle.bgcolor('black')#定義一個畫車的函數def drawCar(): turtle.color('yellow') #先畫后輪子 turtle.fillcolor("yellow") turtle.begin_fill() turtle.circle(20) turtle.end_fill() #提筆往前挪,畫前輪 turtle.penup() turtle.forward(200) turtle.pendown() turtle.begin_fill() turtle.circle(20) turtle.end_fill() #畫車輪廓 turtle.left(90) turtle.forward(50) turtle.right(90) turtle.forward(70) turtle.left(135) turtle.forward(60) turtle.right(45) turtle.forward(2) turtle.left(90) turtle.forward(70) turtle.right(90) turtle.forward(20) turtle.left(90) turtle.forward(160) turtle.left(50) turtle.forward(60) turtle.left(40) turtle.forward(18) turtle.left(90) turtle.forward(240) #畫后輪與車輪廓接觸線 turtle.penup() turtle.home() turtle.pendown() turtle.left(90) turtle.forward(50) turtle.write("this car is made by Mr.cao,2019") #車上方寫標題 turtle.penup() turtle.setpos(60,140) turtle.pendown() turtle.write("豪車!",font=("Times", 22, "bold")) #隱藏那個畫筆箭頭 turtle.hideturtle()#定義個畫笑臉的函數def drawFace(): turtle.color('yellow') turtle.speed(0.1) #先畫笑臉輪廓,畫一個半徑為100像素的圓 turtle.circle(100) #提筆到左上角(-40,120)位置,畫一個小圓,表示右眼 turtle.penup() turtle.setpos(-40,120) turtle.pendown() turtle.circle(10) #提筆到中部位置,先畫一條短線表示上嘴唇 turtle.penup() turtle.setpos(-10,60) turtle.pendown() turtle.forward(20) #繼續下移一定距離,畫一條短弧線表示下嘴唇 turtle.penup() turtle.setpos(-10,40) turtle.pendown() totalTimes=4 for times in range(totalTimes): turtle.forward(5) turtle.left(10) #提筆到右上角(40,120)位置,畫一個小圓,表示右眼 turtle.penup() turtle.setpos(40,120) turtle.pendown() turtle.circle(10) #提示語 turtle.penup() turtle.setpos(-80,-30) turtle.pendown() turtle.write("等待2秒中,準備帶你去看豪車了哦!",font=32) #隱藏那個畫筆箭頭 turtle.hideturtle() #先畫笑臉,等待2s后重置畫筆,然后開始畫車turtle.ontimer(drawFace(),t=2000)turtle.reset()turtle.onclick(drawCar())運行這個文件,整個過程變成了一個簡單的動畫,示例如下:
(7)復雜繪圖示例
用turtle畫出簡單的圖形容易,如果想畫出復雜的圖形則有點考驗耐心和思維過程。網上有很多turtle繪制的復雜圖形,那代碼就會大段大段的寫。限于篇幅我們不再一一復現這些復雜圖形。
幸好在turtle模塊里就有一些案例,在剛才命名的turtle1.py主菜單里的help菜單就有turtle demo
點擊之后就出來一個窗口如下:
從左側的examples可以選擇其中一種案例,窗口左側為turtle代碼,右側點擊start可以顯示出對應的繪圖效果。
如上述的forest案例,點擊start后繪制出來三棵樹,非常漂亮。這些案例中使用到了python的面向對象、函數、隨機、時鐘等多種思維和知識,也是python知識的一種綜合應用,如果方法和毅力得當,確實是提升學習和應用python的有效手段。
由稻粒兒到稻谷團兒 https://zhuanlan.zhihu.com/p/90712358
往期優秀文章
親,需要你的“分享”和“在看”
IT入門?感謝關注 | 程序員題庫→程序員用的單詞表→練習地址:www.520mg.com/it |
總結
以上是生活随笔為你收集整理的python中的画布背景设置_教你用python画图—Turtle详细教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ssrf漏洞 php,DokuWiki
- 下一篇: linux中sed命令用例,Linux中