python之demo1----改編自turtle.py文件中的demo

"""
改編自turtle.py自帶demo
執行 python -m turtledemo 命令查看系統內置demo的源碼

    繪製:須要經過import turtle引入繪製圖形庫turtle庫

    注意:1.全文中的 turtle.xxx()中的turtle本質是該海龜屏幕上默認的海龜實例對象,他等價於turtle.getturtle()返回的對象實例.即任何turtle.xxx()函數均可以寫成turtle.getturtle.xxx()
          2.屏幕正中心爲(0,0)點
"""
import turtle
import time


def demo1():
    # 恢復默認位置和默認方向,保留當前海龜箭頭圖標(此時就是普通箭頭)
    turtle.reset()
    turtle.tracer(True)
    # 畫筆擡起
    turtle.pu()
    # 畫筆向後100像素
    turtle.bk(100)
    # 畫筆放下
    turtle.pd()
    # 設置畫筆線條粗細爲3,同turtle.width(3)
    turtle.pensize(3)
    # 繪製3個正方形; 填充最後一個(i 從 0 - 2循環3次)
    for i in range(3):
        print("當前i=", i)

        if i == 2:
            # 最後一個正方形開始填充
            turtle.begin_fill()

        # 寫字標識當前再畫第幾個正方形
        turtle.write(i + 1, False, align="right")

        # 畫正方形
        draw_square(turtle.getturtle())

        if i == 2:
            # 繪製完正方形後將pencolor和fillcolor設置成褐紅色
            turtle.color("maroon")
            # 最後一個正方形結束填充
            turtle.end_fill()

        # 每次畫完正方形畫筆擡起,而後向前移動30像素再放下
        turtle.pu()
        turtle.fd(30)
        turtle.pd()

    # 設置畫筆線條粗細爲1,同turtle.width(1)
    turtle.pensize(1)
    # 將pencolor和fillcolor設置成黑色
    turtle.color("black")

    # move out of the way
    turtle.tracer(False)
    # 畫筆擡起
    turtle.pu()
    # 右轉90度此時方向向下
    turtle.rt(90)
    # 向前(即向下)移動100像素
    turtle.fd(100)
    # 右轉90度此時方向向左
    turtle.rt(90)
    # 向前(即向左)移動100像素
    turtle.fd(100)
    # 右轉180度此時方向向右
    turtle.rt(180)
    # 畫筆放下
    turtle.pd()
    # 繪製一些文本
    turtle.write("畫樓梯", True)
    turtle.write("start", True)
    # 將pencolor和fillcolor設置成紅色
    turtle.color("red")
    # 畫5個樓梯(從0-4遍歷),最後heading()爲0.0表示方向向右
    for i in range(5):
        turtle.fd(20)
        turtle.lt(90)
        turtle.fd(20)
        turtle.rt(90)
    turtle.tracer(True)
    # 繪製5個填充的樓梯
    turtle.begin_fill()
    for i in range(5):
        turtle.fd(20)
        turtle.lt(90)
        turtle.fd(20)
        turtle.rt(90)
    # 完成填充,由於此時的fillcolor爲red紅色,因此以紅色進行填充
    turtle.end_fill()
    # more text


def switchpen(_turtle):
    """
    間斷效果
    :param _turtle: 將被處理的turtle對象
    """
    if _turtle.isdown():
        _turtle.pu()
    else:
        _turtle.pd()


def draw_square(_turtle):
    """
    畫邊長20像素的正方形
    :param _turtle: 將被處理的turtle對象
    """
    # 方法1
    """
    old = _turtle.heading()
    _turtle.setheading(315)
    _turtle.circle(15, None, 4)
    _turtle.setheading(old)
    """
    # 方法2
    for _ in range(4):
        _turtle.fd(20)
        _turtle.lt(90)


def demo2():
    """Demo of some new features."""
    # 使用最慢速度 0最快,1-10逐漸加快
    turtle.speed(1)
    # 隱藏畫筆(即海龜箭頭),同 turtle.hideturtle()。此時只要畫筆是按下狀態,雖然隱藏了可是仍是能繪製圖形的
    #turtle.ht()
    # 顯示畫筆,同 turtle.showturtle()
    #turtle.st()
    # 設置畫筆線條粗細爲3,同turtle.width(3)
    turtle.pensize(3)
    # 設置海龜箭頭當前方向角度(當前模式下海龜箭頭當前位置指向(0,0)點的向量角度),turtle.towards(0, 0)實際上是當前方向的反方向
    turtle.setheading(turtle.towards(0, 0))
    # 計算半徑(海龜箭頭當前位置到(0,0)位置距離的一半)
    radius = turtle.distance(0, 0)/2.0
    # 海龜箭頭右轉90度,即以海龜箭頭當前位置到(0,0)爲直徑畫
    turtle.rt(90)
    # 畫18次角度爲10度的小段圓弧,畫筆每按下畫一小段就再擡起移動一小段
    for _ in range(18):
        switchpen(turtle.getturtle())
        turtle.circle(radius, 10)
    turtle.write("wait a moment...")

    # 等待2秒
    time.sleep(2)

    # 撤銷全部
    while turtle.undobufferentries():
        turtle.undo()
    # 清屏並將畫筆位置和方向恢復到初始狀態並保持畫筆形狀不變,即位置到原點(0, 0),由於模式是"standard"方向恢復向右,"standard"/"world"模式方向也恢復到默認的向右,"logo"模式方向恢復到默認的向上
    turtle.reset()
    # 海龜箭頭左轉90度
    turtle.lt(90)
    turtle.colormode(255)
    # 定義等邊三角形默認的邊長
    laenge = 10
    turtle.pencolor("green")
    # 設置畫筆線條粗細爲3, 同turtle.width(3)
    turtle.pensize(3)
    # 海龜箭頭左轉180度
    turtle.lt(180)
    # i爲-2 到15 共遍歷18次,之因此i有負數,是由於內循環中turtle.fillcolor(255-15*i, 0, 15*i)中的15*i不能超過255(即colormode的值)
    for i in range(-2, 16):
        print("當前i=", i)
        # 後15次畫的圖形進行填充,每次填充色不一樣
        if i > 0:
            turtle.begin_fill()
            turtle.fillcolor(255-15*i, 0, 15*i)
        # 畫等邊三角形
        for _ in range(3):
            turtle.fd(laenge)
            turtle.lt(120)
        # 後15次畫的圖形填充完畢
        if i > 0:
            turtle.end_fill()

        # 每畫完一個等邊三角形,等邊三角形的變成增長10像素,而且角度左轉15度
        laenge += 10
        turtle.lt(15)

        # 達到 慢->快->慢->快 的效果 (速度值>10 則被置爲0即最快速度)
        turtle.speed((turtle.speed()+1) % 12)

    # 海龜箭頭左轉120度
    turtle.lt(120)
    # 畫筆擡起
    turtle.pu()
    # 向前移動70像素
    turtle.fd(70)
    # 海龜箭頭向右轉30度
    turtle.rt(30)
    # 畫筆放下
    turtle.pd()
    # pencolor設置成紅色而且fillcolor設置成黃色
    turtle.color("red", "yellow")
    # 速度設置成最快
    turtle.speed(0)
    # 畫圖形並填充
    turtle.begin_fill()
    for _ in range(4):
        # 繪製1/4圓
        turtle.circle(50, 90)
        # 右轉90度
        turtle.rt(90)
        # 前移30像素
        turtle.fd(30)
        # 右轉90度
        turtle.rt(90)
    # 圖形填充完畢
    turtle.end_fill()
    # 海龜箭頭左轉90度
    turtle.lt(90)
    # 畫筆擡起
    turtle.pu()
    # 向前移動30像素
    turtle.fd(30)
    # 畫筆放下
    turtle.pd()
    # 海龜箭頭圖標設置成海龜
    turtle.shape("turtle")
    # 獲取(默認的)第一個Turtle實例對象
    tri = turtle.getturtle()    # 下文中的 tri(默認的)第一個Turtle實例對象,能夠將全部的tri替換成turtle,好比tri.lt(100) 可改爲 turtle.lt(100)
    # 設置tri的(海龜箭頭和)畫筆大小的縮放模式爲auto,此模式下(海龜箭頭和)畫筆隨 pensize變化而變化.
    tri.resizemode("auto")
    # 建立一個新的Turtle實例對象並返回該對象實例
    turtle1 = turtle.Turtle()
    # 設置turtle1的(海龜箭頭和)畫筆大小的縮放模式爲auto,此模式下(海龜箭頭和)畫筆隨 pensize變化而變化.
    turtle1.resizemode("auto")
    # turtle1的海龜箭頭圖標設置成海龜
    turtle1.shape("turtle")
    turtle1.reset()
    turtle1.lt(90)
    # turtle1設置畫筆速度爲0最大速度
    turtle1.speed(0)
    # turtle1的畫筆擡起
    turtle1.pu()
    # turtle1的畫筆移動到座標點(280, 40)
    turtle1.goto(280, 40)
    # turtle1的左轉30度
    turtle1.lt(30)
    # turtle1的畫筆放下
    turtle1.pd()
    # turtle1設置畫筆速度爲6
    turtle1.speed(6)
    # turtle1的pencolor設置成藍色而且fillcolor設置成橘黃色
    turtle1.color("blue", "orange")
    # 設置畫筆線條粗細爲2, 同turtle.width(2)
    turtle1.pensize(2)
    # tri設置畫筆速度爲6
    tri.speed(6)
    # tri方向指向turtle1當前位置
    tri.setheading(tri.towards(turtle1))
    count = 1
    # 只要tri與turtle1之間距離>4像素進入循環
    while tri.distance(turtle1) > 4:
        turtle1.fd(3.5)
        turtle1.lt(0.6)
        tri.setheading(tri.towards(turtle1))
        tri.fd(4)
        if count % 20 == 0:
            # 當前位置拷貝一份turtle1實例的當前海龜箭頭圖標
            turtle1.stamp()
            # 當前位置拷貝一份tri實例的當前海龜箭頭圖標
            tri.stamp()
            # tri間斷效果
            switchpen(tri)
            # turtle1間斷效果
            #switchpen(turtle1)
        count += 1
    tri.write("CAUGHT! ", font=("Arial", 16, "bold"), align="right")
    tri.pencolor("black")
    tri.pencolor("red")

    # 等待2秒
    time.sleep(2)

    # 此處的turtle.undobufferentries()等價於turtle.getturtle().undobufferentries()或tri.undobufferentries()表示只要第一個turtle實例能夠撤銷,就一直撤銷,由於tri的操做數量相對於turtle1要多,爲了兩個對象都撤銷完因此用了前者
    while turtle.undobufferentries():
        # tri對象撤銷一步
        tri.undo()
        # turtle1對象撤銷一步
        turtle1.undo()
    # tri對象向前移動50像素
    tri.fd(50)
    tri.write("  Click anywhere to exit!", font=("Courier", 12, "bold"))
    # 獲取海龜屏幕TurtleScreen對象實例
    screen = turtle.getscreen()
    # 註冊點擊事件,點擊海龜屏幕TurtleScreen任何位置,觸發close_window函數
    screen.onclick(close_window)


def close_window(x, y):
    print("點擊位置(", x, ",", y, ")")
    # 獲取當前海龜屏幕TurtleScreen的對象實例
    screen = turtle.getscreen()
    # 清屏
    screen.clearscreen()
    # 關閉窗口
    screen.bye()


def my_main():
    demo1()
    demo2()
    # 保持屏幕,直到點擊窗口右上角關閉按鈕或調用turtle.bye()方法
    turtle.mainloop()


if __name__ == '__main__':
    my_main()
相關文章
相關標籤/搜索