(1).介紹
turtle庫也叫海龜庫,是turtle繪圖體系的Python實現。turtle庫是Python語言的標准庫之一,是入門級的圖形繪制函數庫。
turtle繪圖體系:也叫海龜繪圖系統,它是在1969年誕生,主要用於程序設計入門的一種繪圖方式。
Python計算生態 = 標准庫 + 第三方庫
標准庫:隨解釋器直接安裝到操作系統中的功能模塊。
第三方庫:需要經過安裝才能使用的功能模塊。
turtle官方文檔:https://docs.python.org/3/library/turtle.html
(2).原理
turtle(海龜)是真實的存在,可以想象成一只海龜在窗體正中間,由程序控制在畫布上游走,走過的軌跡形成了繪制的圖形,可以變換海龜的顏色和寬度等。這里海龜就是我們的畫筆。
(3).turtle的繪圖窗體布局
繪制turtle圖形首先需要一個繪圖窗體,在操作系統上表現為一個窗口,它是turtle的一個畫布空間。在窗口中使用的最小單位是像素,例如要繪制一個100單位長度的直線,就是指100像素長的直線。
在一個操作系統上,將顯示器的左上角坐標定義為(0,0),那么我們將窗體的左上角定義為turtle繪圖窗體的坐標原點,相對於整個顯示器坐標為(startx,starty)。這里可以使用turtle.setup(width,height,startx,starty)來設置啟動窗體的位置和大小,當然setup()函數並不是必須的。而且在setup()函數中startx和starty參數是可選的,如果沒有指定這兩個參數,那么系統會默認該窗體在顯示器的正中心。
參數說明:
width和height:如果是整數,則為像素大小;如果是浮點數則為屏幕的百分比。width默認為屏幕的50%,height默認為屏幕的70%。
startx和starty:如果為正,則為距屏幕左側或頂部的像素長度;如果為負,則為舉例屏幕右側或底部的像素長度;如果為None,則水平或垂直居中。
更多窗體控制請查看turtle官方文檔:https://docs.python.org/3/library/turtle.html。

(4).turtle空間坐標體系
在turtle窗體內部形成了一個空間坐標體系,包含絕對坐標和海龜坐標兩種。
1)絕對坐標
對於絕對坐標來講,turtle也就是海龜最開始出現的地方,即畫布的正中心作為絕對坐標的(0,0)。海龜的運行方向向着畫布的右側,所以整個窗體的右方向為x軸,上方向為y軸,由此構成了絕對坐標系。
絕對坐標系在繪圖時經常用到,與之相關的最重要的函數是turtle.goto(x,y),該函數是讓任意位置的海龜到達指定位置。

2)海龜坐標
對於海龜坐標來講,無論海龜朝向什么方向,海龜當前行進方向都叫前進方向,反方向是后退方向,左側是左側方向,右側是右側方向

與之相關的常用函數有:turtle.fd(d),前進d像素距離;turtle.bk(d),后退d像素距離,海龜方向不變;turtle.circle(r,angle),以海龜左側為原點,半徑為r像素,行進angle度圓形弧度,並且海龜方向改變angle度,如果沒有angle,那么行進一個完整的圓。注意:d、r、angle允許負數,意為反方向

(5).turtle角度坐標體系
turtle建立了一個空間坐標體系,那么在空間坐標中,海龜行進的方向也有一個角度,同樣分為絕對角度和海龜角度。
1)絕對角度
對於絕對角度來講,絕對坐標的x正軸表示0度或360度,y正軸表示90度或-270度,x負軸表示180度或-180度,y負軸表示270度或-90度。
與之相關的常用函數為turtle.seth(angle),用於改變海龜行進方向,只改變方向不行進。

2)海龜角度
對於海龜角度來講,為了更好的改變海龜的行進方向,使用左右的方式來改變它的行進角度。
與之相關的函數有:turtle.left(angle)和turtle.right(angle),分別讓海龜向左或向右改變行進方向。

(6).turtle的RGB色彩體系
turtle庫中采用了計算機最常見的RGB色彩體系,取值范圍可以是0-255的整數,也可以是0-1的小數。
常用的RGB色彩如下:
| 英文名稱 | RGB整數值 | RGB小數值 | 中文名稱 |
| white | 255,255,255 | 1,1,1 | 白色 |
| yellow | 255,255,0 | 1,1,0 | 黃色 |
| magenta | 255,0,255 | 1,0,1 | 洋紅 |
| cyan | 0,255,255 | 0,1,1 | 青色 |
| blue | 0,0,255 | 0,0,1 | 藍色 |
| black | 0,0,0 | 0,0,0 | 黑色 |
| seashell | 255,245,238 | 1,0.96,0.93 | 海貝色 |
| gold | 255,215,0 | 1,0.84,0 | 金色 |
| pink | 255,192,203 | 1,0.75,0.80 | 粉紅色 |
| brown | 165,42,42 | 0.65,0.16,0.16 | 棕色 |
| purple | 160,32,240 | 0.63,0.13,0.94 | 紫色 |
| tomato | 255,99,71 | 1,0.39,0.28 | 番茄色 |
turtle庫默認采用RGB的小數值來表示顏色,當然也可以使用函數turtle.colormode(mode)來切換RGB數值模式。當mode為1.0時表示采用小數值來表現RGB,當mode為255時表示采用整數值來表現RGB。
與顏色設置相關的函數:turtle.color()、turtle.pencolor()、turtle.fillcolor(),由於設置畫筆顏色和填充色;還有turtle.bgcolor(),設置窗體背景色。
(7).turtle常用函數
注意:設置參數后,如果沒有取消或重新設置,那么當前程序內一直有效。
1)畫筆控制函數
turtle.penup()、turtle.pu()、turtle.up():抬筆,移動時不繪圖
turtle.pendown()、turtle.pd()、turtle.down():落筆,移動時繪圖
turtle.pensize(width)、turtle.width(width):畫筆寬度
turtle.pencolor(*args):如果不給參數,則返回當前畫筆顏色,給出參數則是設定畫筆顏色。設置顏色有三種方式的參數,pencolor(colorstring)、pencolor((r,g,b))和pencolor(r,g,b)
2)運動控制函數
turtle.forward(distance)、turtle.fd(distance):前進distance像素
turtle.backward(distance)、turtle.bk(distance)、turtle.back(distance):后退distance像素
turtle.circle(r,angle):以畫筆(海龜)左側為圓心,半徑為r像素,畫angle度的圓形。注意:海龜方向同時發生angle度變化
turtle.goto(x,y)、setpos(x,y)、setposition(x,y):由當前坐標前往指定坐標,這里使用絕對坐標,但畫筆方向不會改變
3)方向控制函數
turtle.setheading(angle)、turtle.seth(angle):以絕對角度改變方向
turtle.left(angle)、turtle.lt(angle):以海龜角度向左改變方向
turtle.right(angle)、turtle.rt(angle):以海龜角度向右改變方向
4)更多
更多函數請前往官方文檔查看:https://docs.python.org/3/library/turtle.html
(8).實例
1)繪制一個正方形
import turtle
turtle.pensize(2)
for i in range(4):
turtle.fd(150)
turtle.left(90)
turtle.done()
效果圖:

2)繪制一個正六邊形
import turtle
turtle.pensize(2)
for i in range(6):
turtle.fd(150)
turtle.left(60)
turtle.done()
效果圖

3)繪制一個如圖所示的風輪

import turtle
turtle.pensize(2)
for i in range(4):
turtle.fd(150)
turtle.left(90)
turtle.circle(150,-45)
turtle.goto(0,0)
turtle.left(45)
4)繪制一個如圖所示的太陽花

from turtle import *
color('red', 'yellow') #設置畫筆顏色為紅色,填充色為黃色
begin_fill() #開始填充,必須與end_fill()一起使用
while True: #循環,這里是死循環,通過下方if語句控制跳出循環
forward(200) #前進200像素
left(170) #海龜角度,左轉170度
if abs(pos()) < 1: #abs()返回絕對值,pos()返回當前坐標點,合起來是(0,0)到當前坐標的長度,用於判斷是否回到(0,0)
break #跳出循環
end_fill() #結束填充,運行到這里才會填充顏色
done() #結束后停留在當前窗口
5)繪制一個玫瑰花
import turtle
turtle.speed(5)
# 設置初始位置
turtle.penup()
turtle.goto(0,200)
turtle.pendown()
# 花蕊
turtle.fillcolor("red")
turtle.begin_fill()
turtle.circle(10,180)
turtle.circle(25,110)
turtle.left(50)
turtle.circle(60,45)
turtle.circle(20,170)
turtle.right(24)
turtle.fd(30)
turtle.left(10)
turtle.circle(30,110)
turtle.fd(20)
turtle.left(40)
turtle.circle(90,70)
turtle.circle(30,150)
turtle.right(30)
turtle.fd(15)
turtle.circle(80,90)
turtle.left(15)
turtle.fd(45)
turtle.right(165)
turtle.fd(20)
turtle.left(155)
turtle.circle(150,80)
turtle.left(50)
turtle.circle(150,90)
turtle.end_fill()
# 花瓣1
turtle.left(150)
turtle.circle(-90,70)
turtle.left(20)
turtle.circle(75,105)
turtle.setheading(60)
turtle.circle(80,98)
turtle.circle(-90,40)
# 花瓣2
turtle.left(180)
turtle.circle(90,40)
turtle.circle(-80,98)
turtle.setheading(-83)
# 葉子1
turtle.fd(30)
turtle.left(90)
turtle.fd(25)
turtle.left(45)
turtle.fillcolor("green")
turtle.begin_fill()
turtle.circle(-80,90)
turtle.right(90)
turtle.circle(-80,90)
turtle.end_fill()
turtle.right(135)
turtle.fd(60)
turtle.left(180)
turtle.fd(85)
turtle.left(90)
turtle.fd(80)
# 葉子2
turtle.right(90)
turtle.right(45)
turtle.fillcolor("green")
turtle.begin_fill()
turtle.circle(80,90)
turtle.left(90)
turtle.circle(80,90)
turtle.end_fill()
turtle.left(135)
turtle.fd(60)
turtle.left(180)
turtle.fd(60)
turtle.right(90)
turtle.circle(200,60)
turtle.done()
效果圖如下:

6)櫻花樹(大佬NB!!)
import turtle as T
import random
import time
# 畫櫻花的軀干(60,t)
def Tree(branch, t):
time.sleep(0.0005)
if branch > 3:
if 8 <= branch <= 12:
if random.randint(0, 2) == 0:
t.color('snow') # 白
else:
t.color('lightcoral') # 淡珊瑚色
t.pensize(branch / 3)
elif branch < 8:
if random.randint(0, 1) == 0:
t.color('snow')
else:
t.color('lightcoral') # 淡珊瑚色
t.pensize(branch / 2)
else:
t.color('sienna') # 赭(zhě)色
t.pensize(branch / 10) # 6
t.forward(branch)
a = 1.5 * random.random()
t.right(20 * a)
b = 1.5 * random.random()
Tree(branch - 10 * b, t)
t.left(40 * a)
Tree(branch - 10 * b, t)
t.right(20 * a)
t.up()
t.backward(branch)
t.down()
# 掉落的花瓣
def Petal(m, t):
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)
# 繪圖區域
t = T.Turtle()
# 畫布大小
w = T.Screen()
t.hideturtle() # 隱藏畫筆
t.getscreen().tracer(5, 0)
w.screensize(bg='wheat') # wheat小麥
t.left(90)
t.up()
t.backward(150)
t.down()
t.color('sienna')
# 畫櫻花的軀干
Tree(60, t)
# 掉落的花瓣
Petal(200, t)
w.exitonclick()
效果圖如下:

參考:https://www.cnblogs.com/chen0307/articles/9645138.html
https://blog.csdn.net/as_csdn/article/details/93086075
https://blog.csdn.net/weixin_43943977/article/details/102691392
https://blog.csdn.net/sandalphon4869/article/details/99443949
