Python使用turtle繪制有趣的龍年祝福動畫
今天我們要介紹的是Python的內(nèi)置庫——小海龜(turtle),它是一個非常實用的繪畫工具,不僅可以幫助我們繪制圖形,還能讓我們查看整個繪畫過程。即使對繪畫一竅不通的人也能夠使用它來創(chuàng)作出生動、形象的gif動圖?,F(xiàn)在正是龍年即將到來,距離過年也只有幾天的時間了。因此,我今天的主要目的就是使用小海龜這個工具,畫一副我心目中的拜年gif,提前向大家拜個早年!
turtle
我也可以簡單地介紹一下turtle這個工具庫。簡而言之,turtle允許我們通過控制一個小海龜來繪制圖形。這只海龜?shù)钠瘘c坐標為(0,0),根據(jù)我們的指令,它可以按照我們給出的方向進行移動,并在移動過程中留下軌跡。最后,海龜會將軌跡顯示出來,從而形成我們想要的圖形。坐標的顯示方式是按照嚴格的四象限來劃分的。
當然,你有能力通過調(diào)整小海龜?shù)乃俣葋砜刂评L畫的速度。默認情況下,小海龜?shù)乃俣仍O置為最快的0,最慢的是1。你可以通過增加速度設置的數(shù)值來加快繪畫的速度,數(shù)值越接近10,繪畫速度就會越快。當速度設置超過10時,小海龜將會以0的速度進行繪畫。
另外,值得一提的是,使用這個小海龜工具時,你可以隨時將它重置到初始位置。此外,你還可以自由控制小海龜是否與繪圖區(qū)域接觸。換句話說,如果你不希望小海龜留下路徑,可以將它抬起,就像我們使用中性筆時抬起筆尖一樣。除此之外,其他方面沒有什么特別需要強調(diào)的了。
確實,使用這個小海龜工具進行繪圖確實需要花費一些精力。你需要逐步修改坐標、選擇顏色、改變方向等等。這整個過程的難度甚至比前端開發(fā)還要高。。
福
首先,我認為每逢過年,福字是必不可少的元素。因此,在我的繪圖中,福字是一個至關(guān)重要的元素,所以我首先會畫一個福字,然后再進行其他繪圖內(nèi)容。
相關(guān)api
turtle.bgcolor
:設置背景顏色。主要是先練習,你自己選擇一個好看的顏色就行。
turtle.color
:同時設置畫筆和填充顏色
turtle.speed
:控制小海龜?shù)乃俣?/p>
turtle.penup
:抬筆的動作,這樣的話,你再怎么動小海龜也不會有軌跡出現(xiàn)
turtle.pendown
:放筆的動作,再動就要出現(xiàn)軌跡了
turtle.home
:直接回到原點
turtle.forward
:讓小海龜換方向
turtle.write
:簡單的開始寫字,當然了,如果你不用這個api的話,按照你的提示軌跡,可以一筆一劃的寫出來一個字,這個api不會一筆一劃,就是簡單的把你想要的字放上去而已。
done
:全部完成。不寫這個api的話,做完圖后,整個窗口會自動關(guān)閉。
讓我們先來欣賞一下我所創(chuàng)作的效果圖吧。
我很樂意與大家分享我所創(chuàng)作的效果圖,并附上源碼,供大家參考和學習。請看下方源碼:
import turtle # 導入turtle庫(模塊) turtle.bgcolor("#ffffff") # 設置背景顏色為 turtle.speed(7) # turtle.speed(10) # 可減慢畫正方形和寫字的速度 ### ②畫灰色陰影 turtle.color("#404040") # 同時設置畫筆和填充顏色都為#404040,一種深灰色。 a=100 # 正方形內(nèi)等腰直角三角形的直角邊為a b=2**0.5*a # 斜邊為b ,等腰直角三角形的斜邊=√2倍的直角邊 turtle.penup() turtle.goto(-210,180) # 步驟1光束畫完后,讓海龜返回原點,即海龜移動至坐標(0,0),并設置朝向為初始方向(向右)。 turtle.forward(a) turtle.pendown() turtle.begin_fill() turtle.left(135) turtle.forward(b) turtle.left(90) turtle.forward(b) turtle.left(90) turtle.forward(b) turtle.left(90) turtle.forward(b) turtle.end_fill() ### ③ 畫正方形紅紙 turtle.color("#ea182a") # 同時設置畫筆和填充顏色都為#ea182a,一種紅色。 a=100 b=2**0.5*a turtle.penup() turtle.home() # 第2步灰色陰影畫完后,讓海龜返回原點,即海龜移動至坐標(0,0),并設置朝向為初始方向(向右)。 turtle.goto(-205,180) turtle.forward(a) turtle.pendown() turtle.begin_fill() turtle.left(135) turtle.forward(b) turtle.left(90) turtle.forward(b) turtle.left(90) turtle.forward(b) turtle.left(90) turtle.forward(b) turtle.end_fill() ### ④ 寫文字“?!? turtle.color("black") turtle.penup() turtle.goto(-210,175) # 讓海龜返回原點 turtle.setheading(-90) # 讓海龜頭部朝下 turtle.forward(50) # 讓海龜向下移動150個像素。這個數(shù)字需要不斷調(diào)試。 turtle.pendown() turtle.write("福", align="center",font=("黑體",90,"bold")) ### 海龜繪圖結(jié)束,隱藏海龜 turtle.hideturtle() turtle.done()
賦詩一首
在這個喜慶的新年時刻,作為作者我承認自己的語文水平有限,并不擅長寫春聯(lián)。不過,我想簡單地為大家奉上一首詩作《元日》,以表達我的祝福。希望大家喜歡,祝愿大家新年快樂!
涉及api
turtle.pensize
:就是我們要使用多大號的筆。越大線條越粗。
turtle.shape
:顯示一下小海龜?shù)男螤?/p>
turtle.hideturtle
:隱藏小海龜?shù)男螤?,因為作畫的時候 ,默認時顯示小海龜?shù)?,如果你不想看見他直接隱藏即可。
首先,讓我們一起觀看一下我所準備的效果圖吧。在此我想強調(diào)一點,效果圖中的小箭頭是由于生成gif時產(chǎn)生的,實際效果并沒有這些箭頭存在。
同樣源碼附上,給大家一個參考:
# 海龜寫古詩《元日》 ### 程序初始化設置 import turtle turtle.bgcolor("#b1352b") # 設置背景顏色為#b1352b,一種紅色。ffffff為白色 turtle.speed(0) # 設置海龜繪圖的速度,參數(shù)為0時最快 turtle.pensize(1) # 設置畫筆粗細,即豎線的粗線為1 turtle.pencolor("#f2ea99") # 設置畫筆顏色,即豎線和書法的顏色為#f2ea99,一種黃色。000000為黑色 fontname="黑體" # 字體名稱 fontsize=35 # 字體大小 column1="爆竹聲中一歲除" # column是列的英文單詞 column2="春風送暖入屠蘇" column3="千門萬戶曈曈日" column4="總把新桃換舊符" column5="宋王安石元日" column6="努力的小雨書" colwidth=100 # 設置列寬colwidth ### ① 畫豎線 x=245 # 確定第一條豎線頂端的橫坐標 y=230 # 確定第一條豎線頂端的縱坐標 for i in range(6): # 循環(huán)6次,畫6根豎線 turtle.penup() # 海龜抬筆,沒有移動(繪畫)痕跡 turtle.goto(x,y) # 海龜移動至坐標(x,y) turtle.pendown() # 海龜落筆,移動(繪畫)有痕跡 turtle.setheading(-90) # 讓海龜?shù)念^部朝下 turtle.forward(460) # 讓海龜前進460個像素,即豎線的長度是460像素 x=x-colwidth # 將橫坐標重新賦值為原橫坐標減去列寬colwidth ### ② 海龜寫詩《元日》 turtle.speed(5) # 重新設置海龜寫字的速度 # 寫第1列 x=200 # 設置第1列文字第1個字的橫坐標 y=160 # 設置第1列文字第1個字的縱坐標 for i in range(7): # 第1列共顯示7個字,所以循環(huán)7次 turtle.penup() # 海龜抬筆,沒有移動(繪畫)痕跡 turtle.goto(x,y) # 海龜移動至坐標(x,y) turtle.pendown() # 海龜落筆,移動(繪畫)有痕跡 turtle.write(column1[i], align="center",font=(fontname,fontsize,"normal")) y=y-60 # 每個字間隔60個像素 # 寫第2列 x=x-colwidth y=160 for i in range(7): # 第2列共顯示7個字,所以循環(huán)7次 turtle.penup() turtle.goto(x,y) turtle.pendown() turtle.write(column2[i], align="center",font=(fontname,fontsize)) #第3個參數(shù)省略時默認為"normal" y=y-60 # 寫第3列 x=x-colwidth y=160 for i in range(7): turtle.penup() turtle.goto(x,y) turtle.pendown() turtle.write(column3[i], align="center",font=(fontname,fontsize)) y=y-60 # 寫第4列 x=x-colwidth y=160 for i in range(7): turtle.penup() turtle.goto(x,y) turtle.pendown() turtle.write(column4[i], align="center",font=(fontname,fontsize)) y=y-60 ### ③ 寫落款 # 寫第5列 x=x-80 # 設置第5列第一個字的橫坐標位置 y=100 # 設置第5列第一個字的縱坐標位置 for i in range(6): # 第5列共顯示6個字,所以循環(huán)6次 turtle.penup() turtle.goto(x,y) turtle.pendown() turtle.write(column5[i], align="center",font=(fontname,20,)) y=y-30 # 落款每個字的間隔是30。字小間隔也要小 # 寫第6列 x=x-40 y=100 for i in range(6): # 第6列共顯示9個字,所以循環(huán)9次 turtle.penup() turtle.goto(x,y) turtle.pendown() turtle.write(column6[i], align="center",font=(fontname,20)) y=y-30 turtle.penup() turtle.forward(10) turtle.pendown() turtle.setheading(0) # 讓海龜?shù)念^部朝右 turtle.color("#e1f4d6") # 設置海龜顯示的顏色 turtle.shape("classic") # 設置海龜顯示的形狀 # 海龜寫完水印文字后,返回原點 turtle.penup() turtle.home() turtle.pendown() turtle.done()
煙花
在過年期間,若是不放煙花,咋都說不過去。然而,單獨談論煙花確實很難創(chuàng)作,因為它是一種行動,與福字和詩歌不同。煙花必須要有動勢,也不能忽略煙花自身需要逐漸消失的特點。這其中存在著許多難題,因為一旦消失了,我之前寫的詩句和文字都會消失,就白費功夫了。
一頓搜索下才查找到了回滾這么一個動作。但是回滾這個動作不能讓人看見啊,一個煙花放完了總不能自己還能再縮回去啊,所以又繼續(xù)查,發(fā)現(xiàn)了類似于快進這樣一個功能,讓你看不見中間的流程直接輸出結(jié)果。
終于,我期盼已久的煙火終于來臨。然而,我不愿讓它自行燃放,我想親自參與其中,為大家拜個早年。因此,我決定將煙花的燃放變得更有趣,設計成只有在點擊鼠標后才能綻放。
設計api
turtle.tracer
:是否顯示軌跡
turtle.getscreen()
:獲取整個屏幕,因為我們要鼠標的點擊事件。
turtle.undo()
:這個就是做回滾操作的,但是如果你不想看見動作,你需要和下一個api連用。
turtle.tracer
:這個方法里面有一個delay,可以在幾毫秒中跳過多少個步驟。這個需要你計算。
src.onclick(follow)
:發(fā)送點擊事件,注意這個follow函數(shù)自動傳入兩個參數(shù)也就是x,y兩個坐標值。
讓我們先來欣賞一下效果圖吧。盡管它的外觀可能不是非常出色,但總體而言,我對它還是比較滿意的。
同樣的源碼附上,給大家一個參考:
import turtle import time import random from turtle import * colors = ['red', 'blue', 'yellow', 'white', 'green', 'orange', 'purple', 'seagreen', 'indigo', 'cornflowerblue'] turtle.tracer(False) turtle.ht() src = turtle.getscreen() def draw_firework(count, dis, ang): for c in range(count): forward(dis) left(ang) def follow(startx,starty): need_list = [] ccol = random.choice(colors) dist = random.randint(50, 80) if dist <= 60: angle = 171 else: angle = random.choice([174, 175, 176]) add = (dist - 30) / 10 count = int(360 / (180 - angle)) need_list.append([startx, starty, ccol, dist, angle, add, count]) draw(need_list) def draw(lis): pensize(2) for t in range(5): for li in lis: x, y, col, dis, ang, add, count = li penup(), goto(x - t * add / 2, y), pendown() color('#b1352b', col) begin_fill() setheading(0) draw_firework(count, t * add + 30, ang) end_fill() update() time.sleep(0.015) print('tracer-',tracer()) print('count-',count) turtle.tracer(count*2+8,1) for i in range(count*2+8): undo() turtle.ht() pensize(5) for t in range(10): for li in lis: x, y, col, dis, ang, add, count = li count = int(count / 4) penup(), goto(x - add * 5 + 10, y), pendown() setheading(-90) stara = dis / 2 - 10 penup(), left(90), backward(2 * t), right(90) for i in range(count): penup() pencolor(col) circle(stara + t * 2, 360 / count - 1) pendown() circle(stara + t * 2, 1) update() time.sleep(0.03) # clear() turtle.tracer(count*4,1) for i in range(count*4): undo() turtle.ht() src.onclick(follow) turtle.done()
龍年快樂
所有的元素都已經(jīng)完成,剩下的只需拼裝在一起。我覺得這里的背景顯得過于單一,所以我決定直接使用一張圖作為背景。當然,如果你有時間,完全可以自己單獨制作一張背景圖。不多說了,祝福大家龍年快樂!愿你們的生活像龍一樣充滿力量和勇氣,愿你們在新的一年里,追逐夢想,勇往直前,不斷超越自我。愿你們的家庭幸福美滿,團圓和諧。愿你們的事業(yè)蒸蒸日上,財源廣進。愿你們的身體健康強壯,心靈充實。讓我們一起慶祝龍年,共同創(chuàng)造美好的未來!
以上就是Python使用turtle繪制有趣的龍年祝福動畫的詳細內(nèi)容,更多關(guān)于Python turtle繪制動畫的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
PySpark與GraphFrames的安裝與使用環(huán)境搭建過程
這篇文章主要介紹了PySpark與GraphFrames的安裝與使用教程,本文通過圖文并茂實例代碼相結(jié)合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-02-02python pandas合并Sheet,處理列亂序和出現(xiàn)Unnamed列的解決
這篇文章主要介紹了python pandas合并Sheet,處理列亂序和出現(xiàn)Unnamed列的解決方案,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03python多種數(shù)據(jù)類型輸出為Excel文件
本文主要介紹了將Python中的列表、元組、字典和集合等數(shù)據(jù)類型輸出到Excel文件中,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2025-03-03Python直接使用plot()函數(shù)畫圖的方法實例
Python非常簡單而又非常強大,它的功能之一就是畫出漂亮的圖表,實現(xiàn)數(shù)據(jù)的可視化,下面這篇文章主要給大家介紹了關(guān)于Python直接使用plot()函數(shù)畫圖的相關(guān)資料,需要的朋友可以參考下2022-05-05