python的turtle繪圖

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章