Python基本圖形繪製庫——turtle

(1).介紹html

  turtle庫也叫海龜庫,是turtle繪圖體系的Python實現。turtle庫是Python語言的標準庫之一,是入門級的圖形繪製函數庫。python

  turtle繪圖體系:也叫海龜繪圖系統,它是在1969年誕生,主要用於程序設計入門的一種繪圖方式。shell

  Python計算生態 = 標準庫 + 第三方庫dom

  標準庫:隨解釋器直接安裝到操做系統中的功能模塊。ide

  第三方庫:須要通過安裝才能使用的功能模塊。函數

  turtle官方文檔:https://docs.python.org/3/library/turtle.html佈局

(2).原理spa

  turtle(海龜)是真實的存在,能夠想象成一隻海龜在窗體正中間,由程序控制在畫布上游走,走過的軌跡造成了繪製的圖形,能夠變換海龜的顏色和寬度等。這裏海龜就是咱們的畫筆。操作系統

(3).turtle的繪圖窗體佈局.net

  繪製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

   http://www.javashuo.com/article/p-rkczboot-d.html

   https://blog.csdn.net/sandalphon4869/article/details/99443949

相關文章
相關標籤/搜索