一篇帶你實戰(zhàn)的Python繪圖Turtle庫
Turtle庫是Python語言中一個很流行的繪制圖像的函數(shù)庫,想象一個小烏龜,在一個橫軸為x、縱軸為y的坐標(biāo)系原點,(0,0)位置開始,它根據(jù)一組函數(shù)指令的控制,在這個平面坐標(biāo)系中移動,從而在它爬行的路徑上繪制了圖形。
turtle繪圖的基礎(chǔ)知識:
1. 畫布(canvas)
畫布就是turtle為我們展開用于繪圖區(qū)域,我們可以設(shè)置它的大小和初始位置。
? ? ? ? 設(shè)置畫布大小
? ? ? ? ?turtle.screensize(canvwidth=None, canvheight=None, bg=None),參數(shù)分別為畫布的寬(單位像素), 高, 背景顏色。
? ? ? ? 如:turtle.screensize(800,600, "green")
? ? ? ? ? ? ? ?turtle.screensize() #返回默認(rèn)大小(400, 300)
? ? ? ? turtle.setup(width=0.5, height=0.75, startx=None, starty=None),參數(shù):width, height: 輸入寬和高為整數(shù)時, 表示像素; 為小數(shù)時, 表示占據(jù)電腦屏幕的比例,(startx, starty): 這一坐標(biāo)表示矩形窗口左上角頂點的位置, 如果為空,則窗口位于屏幕中心。
? ? ? ? 如:turtle.setup(width=0.6,height=0.6)
? ? ? ? ? ? ? ?turtle.setup(width=800,height=800, startx=100, starty=100)
2. 畫筆
2.1 畫筆的狀態(tài)
? 在畫布上,默認(rèn)有一個坐標(biāo)原點為畫布中心的坐標(biāo)軸,坐標(biāo)原點上有一只面朝x軸正方向小烏龜。這里我們描述小烏龜時使用了兩個詞語:坐標(biāo)原點(位置),面朝x軸正方向(方向), turtle繪圖中,就是使用位置方向描述小烏龜(畫筆)的狀態(tài)。
2.2 畫筆的屬性
?畫筆(畫筆的屬性,顏色、畫線的寬度等)
? ? ? ? 1) turtle.pensize():設(shè)置畫筆的寬度;
? ? ? ? 2) turtle.pencolor():沒有參數(shù)傳入,返回當(dāng)前畫筆顏色,傳入?yún)?shù)設(shè)置畫筆顏色,可以是字符串如"green", "red",也可以是RGB 3元組。
? ? ? ? 3) turtle.speed(speed):設(shè)置畫筆移動速度,畫筆繪制的速度范圍[0,10]整數(shù),數(shù)字越大越快。
2.3 繪圖命令
操縱海龜繪圖有著許多的命令,這些命令可以劃分為3種:一種為運(yùn)動命令,一種為畫筆控制命令,還有一種是全局控制命令。
(1)????畫筆運(yùn)動命令

(2)???? 畫筆控制命令

(3)????全局控制命令

(4)????其他命令

3. 命令詳解
? ? ? ? 3.1 turtle.circle(radius, extent=None, steps=None)
? ? ? ? 描述:以給定半徑畫圓
? ? ? ? 參數(shù):
? ? ? ? radius(半徑):半徑為正(負(fù)),表示圓心在畫筆的左邊(右邊)畫圓;
? ? ? ? extent(弧度) (optional);
? ? ? ? steps (optional) (做半徑為radius的圓的內(nèi)切正多邊形,多邊形邊數(shù)為steps)。
舉例:
circle(50) # 整圓;
circle(50,steps=3) # 三角形;
circle(120, 180) # 半圓
?
實例:
1、太陽花


2、五角星


3、時鐘程序
# coding=utf-8
?
import turtle
from datetime import *
?
# 抬起畫筆,向前運(yùn)動一段距離放下
def Skip(step):
? ? turtle.penup()
? ? turtle.forward(step)
? ? turtle.pendown()
?
def mkHand(name, length):
? ? # 注冊Turtle形狀,建立表針Turtle
? ? turtle.reset()
? ? Skip(-length * 0.1)
? ? # 開始記錄多邊形的頂點。當(dāng)前的烏龜位置是多邊形的第一個頂點。
? ? turtle.begin_poly()
? ? turtle.forward(length * 1.1)
? ? # 停止記錄多邊形的頂點。當(dāng)前的烏龜位置是多邊形的最后一個頂點。將與第一個頂點相連。
? ? turtle.end_poly()
? ? # 返回最后記錄的多邊形。
? ? handForm = turtle.get_poly()
? ? turtle.register_shape(name, handForm)
?
def Init():
? ? global secHand, minHand, hurHand, printer
? ? # 重置Turtle指向北
? ? turtle.mode("logo")
? ? # 建立三個表針Turtle并初始化
? ? mkHand("secHand", 135)
? ? mkHand("minHand", 125)
? ? mkHand("hurHand", 90)
? ? secHand = turtle.Turtle()
? ? secHand.shape("secHand")
? ? minHand = turtle.Turtle()
? ? minHand.shape("minHand")
? ? hurHand = turtle.Turtle()
? ? hurHand.shape("hurHand")
? ?
? ? for hand in secHand, minHand, hurHand:
? ? ? ? hand.shapesize(1, 1, 3)
? ? ? ? hand.speed(0)
? ?
? ? # 建立輸出文字Turtle
? ? printer = turtle.Turtle()
? ? # 隱藏畫筆的turtle形狀
? ? printer.hideturtle()
? ? printer.penup()
? ??
def SetupClock(radius):
? ? # 建立表的外框
? ? turtle.reset()
? ? turtle.pensize(7)
? ? for i in range(60):
? ? ? ? Skip(radius)
? ? ? ? if i % 5 == 0:
? ? ? ? ? ? turtle.forward(20)
? ? ? ? ? ? Skip(-radius - 20)
? ? ? ? ? ?
? ? ? ? ? ? Skip(radius + 20)
? ? ? ? ? ? if i == 0:
? ? ? ? ? ? ? ? turtle.write(int(12), align="center", font=("Courier", 14, "bold"))
? ? ? ? ? ? elif i == 30:
? ? ? ? ? ? ? ? Skip(25)
? ? ? ? ? ? ? ? turtle.write(int(i/5), align="center", font=("Courier", 14, "bold"))
? ? ? ? ? ? ? ? Skip(-25)
? ? ? ? ? ? elif (i == 25 or i == 35):
? ? ? ? ? ? ? ? Skip(20)
? ? ? ? ? ? ? ? turtle.write(int(i/5), align="center", font=("Courier", 14, "bold"))
? ? ? ? ? ? ? ? Skip(-20)
? ? ? ? ? ? else:
? ? ? ? ? ? ? ? turtle.write(int(i/5), align="center", font=("Courier", 14, "bold"))
? ? ? ? ? ? Skip(-radius - 20)
? ? ? ? else:
? ? ? ? ? ? turtle.dot(5)
? ? ? ? ? ? Skip(-radius)
? ? ? ? turtle.right(6)
? ? ? ??
def Week(t):? ?
? ? week = ["星期一", "星期二", "星期三",
? ? ? ? ? ? "星期四", "星期五", "星期六", "星期日"]
? ? return week[t.weekday()]
?
def Date(t):
? ? y = t.year
? ? m = t.month
? ? d = t.day
? ? return "%s %d%d" % (y, m, d)
?
def Tick():
? ? # 繪制表針的動態(tài)顯示
? ? t = datetime.today()
? ? second = t.second + t.microsecond * 0.000001
? ? minute = t.minute + second / 60.0
? ? hour = t.hour + minute / 60.0
? ? secHand.setheading(6 * second)
? ? minHand.setheading(6 * minute)
? ? hurHand.setheading(30 * hour)
? ??
? ? turtle.tracer(False)?
? ? printer.forward(65)
? ? printer.write(Week(t), align="center",
? ? ? ? ? ? ? ? ? font=("Courier", 14, "bold"))
? ? printer.back(130)
? ? printer.write(Date(t), align="center",
? ? ? ? ? ? ? ? ? font=("Courier", 14, "bold"))
? ? printer.home()
? ? turtle.tracer(True)
?
? ? # 100ms后繼續(xù)調(diào)用tick
? ? turtle.ontimer(Tick, 100)
?
def main():
? ? # 打開/關(guān)閉龜動畫,并為更新圖紙設(shè)置延遲。
? ? turtle.tracer(False)
? ? Init()
? ? SetupClock(160)
? ? turtle.tracer(True)
? ? Tick()
? ? turtle.mainloop()
?
if __name__ == "__main__":
? ? main()
