turtle繪圖
今天學到了python的turtle繪圖,感覺還蠻好玩的。在知乎、python123上看到很多大佬的繪圖,感覺很有意思,看到有些結合了random庫、time庫畫出來的二叉樹很美、很神奇。
我也搜到很多turtle繪圖的教程,比如CSDN上發的Python海龜繪圖法詳細介紹,結果發現CSDN這篇文章是從官網turtle庫中文介紹搬運而來,直接去看官網文檔就好了。
官網上說:“海龜繪圖很適合用來引導孩子學習編程。…… 最初來自於 Logo 編程語言。” turtle庫畫圖雖然上手簡單,但是也不要小看了,結合一些其他庫(random庫、time庫)和函數遞歸就能畫出很複雜炫酷的圖。
python自帶了一些turtle畫圖的demo在Command Prompt敲下面的代碼就可以打開啦,這裏有別人放的demo。
python -m turtledemo
這裏也可以演示單獨的腳本,就可以直接看到畫出的圖,bytedesign是演示腳本名,可以根據文檔中提供的清單換成其他的demo。這些demo有些還挺複雜的,融合python其他的知識,乍一看可能看不懂,先mark一下。
python -m turtledemo.bytedesign
名稱 | 描述 | 相關特性 |
---|---|---|
bytedesign | 複雜的傳統海龜繪圖模式 | tracer() , delay, update() |
chaos | 繪製 Verhulst 動態模型,演示通過計算機的運算可能會生成令人驚歎的結果 | 世界座標系 |
clock | 繪製模擬時鐘顯示本機的當前時間 | 海龜作爲錶針, ontimer |
colormixer | 試驗 r, g, b 顏色模式 | ondrag() 當鼠標拖動 |
forest | 繪製 3 棵廣度優先樹 | 隨機化 |
fractalcurves | 繪製 Hilbert & Koch 曲線 | 遞歸 |
lindenmayer | 文化數學 (印度裝飾藝術) | L-系統 |
minimal_hanoi | 漢諾塔 | 矩形海龜作爲漢諾盤 (shape, shapesize) |
nim | 玩經典的“尼姆”遊戲,開始時有三堆小棒,與電腦對戰。 | 海龜作爲小棒,事件驅動 (鼠標, 鍵盤) |
paint | 超極簡主義繪畫程序 | onclick() 當鼠標點擊 |
peace | 初級技巧 | 海龜: 外觀與動畫 |
penrose | 非週期性地使用風箏和飛鏢形狀鋪滿平面 | stamp() 印章 |
planet_and_moon | 模擬引力系統 | 複合開關, Vec2D 類 |
round_dance | 兩兩相對並不斷旋轉舞蹈的海龜 | 複合形狀, clone shapesize, tilt, get_shapepoly, update |
sorting_animate | 動態演示不同的排序方法 | 簡單對齊, 隨機化 |
tree | 一棵 (圖形化的) 廣度優先樹 (使用生成器) | clone() 克隆 |
two_canvases | 簡單設計 | 兩塊畫布上的海龜 |
wikipedia | 一個來自介紹海龜繪圖的維基百科文章的圖案 | clone() , undo() |
yinyang | 另一個初級示例 | circle() 畫圓 |
colormixer
這是demo中的 colormixer,用來試驗 r, g, b 顏色模式 結合了ondrag()
實現鼠標拖動的交互功能,蠻神奇的!!
還有一些簡單好玩的小例子我放在下面,下面這幾個是看了嵩天老師python課程的初學者就能搞定的,上面那些可能還要琢磨琢磨,我暫時就搞不定。
粉色小愛心
from turtle import *
color('pink')
begin_fill()
left(135)
fd(100)
right(180)
circle(50,-180)
left(90)
circle(50,-180)
right(180)
fd(100)
end_fill()
hideturtle()
done()
七段數碼管繪製
嵩天老師七段數碼管繪製的案例,涉及到函數的使用、time庫、turtle庫的知識,是個蠻有意思的小案例。
科赫雪花繪製
涉及函數遞歸的思想和方法,就是一個函數調用自己,好像很簡單,但是又有點繞 = = 漢諾塔的遞歸方法求解就讓人摸不着頭腦
樹的代碼
來源於知乎,沒明白原答案中turtle爲啥import兩次,這裏改動了一下,還是可以正常運行。
import random
import turtle as t
# 樹的主體
def tree(branchLen):
if branchLen > 3:
if branchLen < 8: # 最短的樹枝部分
if random.randint(0, 1) == 0:
t.color('snow')
else:
t.color('lightcoral') # 珊瑚色
t.pensize(branchLen / 2)
elif 8 <= branchLen <= 12:
if random.randint(0, 2) == 0:
t.color('snow')
else:
t.color('lightcoral')
t.pensize(branchLen / 3)
else: # 表示樹幹部分 >12
t.color('sienna') # 赭色
t.pensize(branchLen / 10)
t.forward(branchLen)
a = 1.5 * random.random()
t.right(20*a)
b = 1.5 * random.random()
tree(branchLen-10*b) # 遞歸 樹枝變細
t.left(40*a)
tree(branchLen-10*b)
t.right(20*a)
t.up()
t.backward(branchLen)
t.down()
def petal(m): # 樹下花瓣
for i in range(m):
a = 200 - 400 * random.random()
b = 10 - 20 * random.random()
t.up()
t.forward(b)
t.left(90)
t.forward(a)
t.down()
t.color("lightcoral")
t.circle(1)
t.up()
t.backward(a)
t.right(90)
t.backward(b)
def main():
t.getscreen().tracer(5, 0)
t.screensize(bg='wheat')
t.left(90)
t.up()
t.backward(150)
t.down()
t.color('sienna')
tree(60)
petal(100)
t.ht()
t.exitonclick()
main()