Python基礎圖形繪制庫——turtle


(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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM