不間斷 Python 挑戰 Day 24 - Turtle Graphics繪圖模組

更新於 發佈於 閱讀時間約 14 分鐘

Turtle Graphic的前身是一種設計給小朋友學習的簡易繪圖程式,最初來自於Wally Feurzeig、Seymour Papert和Cynthia Solomon於1967年所創造的Logo編程語言,它是Python內建的繪圖函式庫,我們可以根據函式庫裡面的指令,操控一隻或多隻「小烏龜」在帶有平面座標的「畫布」上移動,小烏龜帶有畫筆,在它移動的軌跡上,可以讓畫筆提起或放下來決定畫或不畫出線條。本節會介紹一些基本的用法,詳細的內容可以參閱官方文件

畫布 (Canvas)

在繪製圖形之前,首先必須要有可以繪製圖形的區域,也稱為畫布。以下程式載入turtle模組,並建立Screen的物件,最後再呼叫exitonclick()方法讓使用者點一下畫布後再結束程式,以免程式執行後畫布閃一下即消失。

from turtle import Screen
screen = Screen()
screen.exitonclick()

執行結果:

raw-image

背景顏色

以下三種方式可以設定畫布的背景顏色:

screen.bgcolor(顏色字串)

  顏色字串可參考:https://www.tcl.tk/man/tcl8.4/TkCmd/colors.html
例如:

screen.bgcolor("green")
screen.bgcolor(hex code number)

  hex code number可參考:https://en.wikipedia.org/wiki/Web_colors
例如:

screen.bgcolor("#008000")
screen.bgcolor(r, g, b)

  其中r、g、b的範圍由screen.colormode(cmode)決定,預設為1,cmode可為1或255,r、g、b必須介於0到cmode之間,例如:

screen.colormode(255)
screen.bgcolor(0, 255, 0)

執行結果皆為設定畫布背景為綠色:

raw-image

標題

screen.title(titlestring)

  可改變畫布左上角的標題,例如:

screen.title("我的畫布")
raw-image

視窗大小與位置

screen.setup(width=_CFG['width'], height=_CFG['height'], startx=_CFG['leftright'], starty=_CFG['topbottom'])

  可設置畫布主視窗的大小與位置,width與height若為整數表示像素、若為浮點數則表示螢幕的占比;startx若為正數表示距離左邊緣多少像素、若為負數表示距離右邊緣多少像素;starty若為正數表示距離上邊緣多少像素、若為負數表示距離右下邊緣多少像素。

清除繪圖

screen.clear()
screen.clearscreen()

  可將畫布上的所有繪圖清除。

畫筆

有了畫布之後,載入turtle模組並建立Turtle的物件,執行後便可看到畫布中央多了一個預設為向右的箭頭,預設的位置即為畫布的原點,也是畫布的中心點,向右為x軸的正向、向上為y軸的正向,以此訂出畫布的座標系統。

from turtle import Turtle
turtle = Turtle()
raw-image

前進、後退

turtle.forward(distance)
turtle.fd(distance)

  往原本的方向前進distance指定的距離(像素)。

turtle.back(distance)
turtle.bk(distance)
turtle.backward(distance)

  後退distance指定的距離(像素),不改變畫筆的朝向

以下範例讓畫筆前進100步再後退100步。

turtle.forward(100)
turtle.backward(100)
raw-image

移至定點

turtle.goto(x, y=None)
turtle.setpos(x, y=None)
turtle.setposition(x, y=None)

  將畫筆移動到座標(x, y)的地方,整個畫布以中心為原點(0, 0),向右為x軸正向、向上為y軸正向,如以下範例建立一個600*600大小的畫布,把畫筆移動到(-200, 200)的位置。

screen.setup(600, 600)
turtle.goto(-200, 200)
raw-image
turtle.setx(x)

  將畫筆移動到指定的x座標。

turtle.sety(y)

  將畫筆移動到指定的y座標。

如下例最後停止的位置和前例相同,但軌跡不同。

turtle.setx(-200)
turtle.sety(200)
raw-image

回到原點

turtle.home()

  回到畫布中心(0, 0)的位置。

速度

turtle.speed(speed=None)

  設定畫筆移動的速度,範圍在0到10之間,除了0以外,數字愈大畫筆移動的速度愈快,也可以使用文字做為參數輸入,和數字的對應如下:

  • “fastest”: 0
  • “fast”: 10
  • “normal”: 6
  • “slow”: 3
  • “slowest”: 1

提筆下筆

turtle.penup()
turtle.pu()
turtle.up()

  畫筆移動時不畫出軌跡。

turtle.pendown()
turtle.pd()
turtle.down()

  畫筆移動時畫出軌跡。

先使用penup()方法,再移動至指定座標,過程中便不會畫出移動軌跡。

turtle.penup()
turtle.goto(-200, 200)
raw-image

顯示隱藏畫筆

turtle.showturtle()
turtle.st()

  顯示畫筆。

turtle.hideturtle()
turtle.ht()

  隱藏畫筆。

移動方向

turtle.right(angle)
turtle.rt(angle)

  右轉angle個單位,預設為角度,單位可由turtle.degrees()turtle.radians()設定。

turtle.left(angle)
turtle.lt(angle)

  左轉angle個單位,預設為角度,單位可由turtle.degrees()turtle.radians()設定。

turtle.setheading(to_angle)
turtle.seth(to_angle)

  轉至特定的角度。

至此為止,我們可以結合移動跟角度來畫出一些比較複雜的圖形。

turtle.penup()
turtle.goto(-100, 200)
turtle.pendown()

for side in range(3, 11):
  angle = 360/side
  for _ in range(side):
    turtle.forward(100)
    turtle.right(angle)
raw-image

詢問位置方向

turtle.position()
turtle.pos()

  詢問畫筆的(x, y)座標。

turtle.xcor()

  詢問畫筆的x座標。

turtle.ycor()

  詢問畫筆的y座標。

turtle.heading()

  詢問畫筆的方向(角度)。

顏色

turtle.pencolor(*args)
turtle.pencolor(顏色字串)
turtle.pencolor(hex code number)
turtle.pencolor(r, g, b)

  設定畫筆軌跡與畫筆外緣的顏色,設定方式和畫布的背景顏色相同,其中r、g、b的範圍由screen.colormode(cmode)決定。

turtle.fillcolor(*args)
turtle.fillcolor(顏色字串)
turtle.fillcolor(hex code number)
turtle.fillcolor(r, g, b)

設定畫筆軌跡圍出區域與畫筆內部的填充顏色,設定方式和畫布的背景顏色相同,其中r、g、b的範圍由screen.colormode(cmode)決定。

turtle.color(*args)

  當輸入一個參數時,會同時設定pencolor和fillcolor;當輸入兩個參數時,第一個參數設定pencolor,第二個參數設定fillcolor。參數的設定方式和pencolor及fillcolor相同。

填充顏色

turtle.begin_fill()
turtle.end_fill()

  在開始繪製圖形的前後分別呼叫turtle.begin_fill()及turtle.end_fill(),在繪製結束後填充顏色到繪製區域內。

screen.colormode(255)
turtle.fillcolor(0, 255, 0)

turtle.penup()
turtle.goto(-50, 0)
turtle.pendown()

turtle.begin_fill()
for _ in range(5):
  turtle.forward(100)
  turtle.left(144)
turtle.end_fill()
raw-image

寫字

turtle.write(arg, move=False, align='left', font=('Arial', 8, 'normal'))

  畫布上面也可以寫文字,參數設定方式如下:

  • arg – 文字內容。
  • move – 設為True時,畫筆會移動到文字的右下角。
  • align – 對齊方式,可為"left"(置左)、"center"(置中)或"right"(置右)。
  • font – 以元組的形式設定字體(font)、字體大小(font size)、以及字型(font type)
turtle.write("Hello 你好!", move=False, align="center", font=("Arial", 20, "bold"))
raw-image

畫筆形狀

turtle.shape(name=None)

  目前為止我們看到的畫筆筆頭預設都是箭頭的形狀,也可以換成以下這些形狀:"arrow"、"turtle"、"circle"、"square"、"triangle"、"classic"。

既然這個模組名稱叫Turtle graphics,怎麼可以沒有小烏龜呢?讓小烏龜跑起來吧!這個範例中建立了五個Turtle物件,分別有不同的顏色、位置,並由亂數每次隨機選擇一隻小烏龜往前跑10步,就像是一個烏龜賽跑的遊戲,看看誰會先跑到終點!

註1:程式在初始化Turtle物件時同時傳入參數將畫筆設為"Turtle",並隱藏畫筆,使畫面上看不到畫筆設定的轉換及移動至定位的過程,增加視覺上的流暢度。

註2:程式中引入了time模組中的sleep()方法,讓程式執行過程中停頓所設定的秒數,以避免動作之間過於密集。

import random
import time

turtle_list = []
turtle_color_list = ["green", "blue", "red", "yellow", "purple"]
turtle_start_x = -280
turtle_start_y = -200

for player in range(5):
  turtle = Turtle(shape="turtle", visible=False)
  turtle.color(turtle_color_list[player])
  turtle.penup()
  turtle.goto(turtle_start_x, turtle_start_y)
  turtle.showturtle()
  turtle_list.append(turtle)
  turtle_start_y += 100

time.sleep(1)
is_race_on = True
while is_race_on:
  time.sleep(0.04)
  player = random.randint(0, 4)
  turtle_list[player].forward(10)
  if turtle_list[player].xcor() > 260:
    is_race_on = False
raw-image

程式範例

本文程式範例收錄於:
https://github.com/wjweng/marathon_python/blob/master/Day1_to_25/marathon_python_day24.py

留言
avatar-img
留言分享你的想法!
avatar-img
Wei-Jie Weng的沙龍
48會員
36內容數
Wei-Jie Weng的沙龍的其他內容
2022/07/13
對於程式的初學者而言,理解程式的流程、迴圈的進行、或是變數的變化會需要一定程度將程式在腦中進行運算的能力,要一段時間熟悉與適應,尤其是當程式執行的結果不如預期時,往往是計算的過程和自己所想像的不同,這時又更難靠自己的能力找出錯誤。因此,這邊要介紹的這個工具可以將程式執行的過程逐行將變數的變化視覺化地
Thumbnail
2022/07/13
對於程式的初學者而言,理解程式的流程、迴圈的進行、或是變數的變化會需要一定程度將程式在腦中進行運算的能力,要一段時間熟悉與適應,尤其是當程式執行的結果不如預期時,往往是計算的過程和自己所想像的不同,這時又更難靠自己的能力找出錯誤。因此,這邊要介紹的這個工具可以將程式執行的過程逐行將變數的變化視覺化地
Thumbnail
2022/07/13
在上一節介紹了 JSON 資料的基本架構後,我們將改寫並擴充密碼產生器程式,讓它能夠藉由 JSON 的資料結構完成帳密搜尋的功能。
Thumbnail
2022/07/13
在上一節介紹了 JSON 資料的基本架構後,我們將改寫並擴充密碼產生器程式,讓它能夠藉由 JSON 的資料結構完成帳密搜尋的功能。
Thumbnail
2022/06/23
JSON的全名叫JavaScript Object Notation,是由Douglas Crockford所設計的一種資料格式,最初應用在JavaScript程式語言中,做為一種資料交換的格式,而後被廣泛運用在Web開發與NoSQL資料庫,現今已成為一種重要的資料格式。
Thumbnail
2022/06/23
JSON的全名叫JavaScript Object Notation,是由Douglas Crockford所設計的一種資料格式,最初應用在JavaScript程式語言中,做為一種資料交換的格式,而後被廣泛運用在Web開發與NoSQL資料庫,現今已成為一種重要的資料格式。
Thumbnail
看更多
你可能也想看
Thumbnail
介紹朋友新開的蝦皮選物店『10樓2選物店』,並分享方格子與蝦皮合作的分潤計畫,註冊流程簡單,0成本、無綁約,推薦給想增加收入的讀者。
Thumbnail
介紹朋友新開的蝦皮選物店『10樓2選物店』,並分享方格子與蝦皮合作的分潤計畫,註冊流程簡單,0成本、無綁約,推薦給想增加收入的讀者。
Thumbnail
當你邊吃粽子邊看龍舟競賽直播的時候,可能會順道悼念一下2300多年前投江的屈原。但你知道端午節及其活動原先都與屈原毫無關係嗎?這是怎麼回事呢? 本文深入探討端午節設立初衷、粽子、龍舟競渡與屈原自沉四者。看完這篇文章,你就會對端午、粽子、龍舟和屈原的四角關係有新的認識喔。那就讓我們一起解開謎團吧!
Thumbnail
當你邊吃粽子邊看龍舟競賽直播的時候,可能會順道悼念一下2300多年前投江的屈原。但你知道端午節及其活動原先都與屈原毫無關係嗎?這是怎麼回事呢? 本文深入探討端午節設立初衷、粽子、龍舟競渡與屈原自沉四者。看完這篇文章,你就會對端午、粽子、龍舟和屈原的四角關係有新的認識喔。那就讓我們一起解開謎團吧!
Thumbnail
將畫麻雀變成一個公式後,發現可以用這公式畫到好多好看又簡單的麻雀,和大家分享。 ❤❤ 基本次序 1.頭的啡色 2.身上黑色 3.肚子+頭上白色部分的處理 4.背上啡色 5.眼和嘴巴 使用顏色 啡,紅,藍,黑 使用畫筆 一大一小筆頭的畫筆就可以 有了這方式,就可
Thumbnail
將畫麻雀變成一個公式後,發現可以用這公式畫到好多好看又簡單的麻雀,和大家分享。 ❤❤ 基本次序 1.頭的啡色 2.身上黑色 3.肚子+頭上白色部分的處理 4.背上啡色 5.眼和嘴巴 使用顏色 啡,紅,藍,黑 使用畫筆 一大一小筆頭的畫筆就可以 有了這方式,就可
Thumbnail
▪︎咒語描述: 可愛貼圖設計,一位卡通人物,黃金比例,一個穿著藍色T shirt、長著貓耳朵的白色小貓男孩,頭上舉著一片綠葉,手上拿著一條魚,淺色背景為綠色和粉紅色,融入了草花、水坑等自然元素。 ▪︎工具:Copilot
Thumbnail
▪︎咒語描述: 可愛貼圖設計,一位卡通人物,黃金比例,一個穿著藍色T shirt、長著貓耳朵的白色小貓男孩,頭上舉著一片綠葉,手上拿著一條魚,淺色背景為綠色和粉紅色,融入了草花、水坑等自然元素。 ▪︎工具:Copilot
Thumbnail
▪︎咒語描述: 為「小象坐在一朵雲上」設計一個標誌,慶祝野生動物和森林,以動物和自然景觀為特色。 使用雲彩色調和逼真的雨林野生動物描繪。 寬高比 16:9,比例 50,版本 5.2。 ▪︎工具:Copilot
Thumbnail
▪︎咒語描述: 為「小象坐在一朵雲上」設計一個標誌,慶祝野生動物和森林,以動物和自然景觀為特色。 使用雲彩色調和逼真的雨林野生動物描繪。 寬高比 16:9,比例 50,版本 5.2。 ▪︎工具:Copilot
Thumbnail
為什麼小海龜們叫那頭老海龜「陸龜」﹖ 先來一點動物學知識﹕區別海龜 (turtle) 和陸龜 (tortoise) 的一個特徵是,海龜主要生活在水中,而陸龜主要生活在陸地上。 ...
Thumbnail
為什麼小海龜們叫那頭老海龜「陸龜」﹖ 先來一點動物學知識﹕區別海龜 (turtle) 和陸龜 (tortoise) 的一個特徵是,海龜主要生活在水中,而陸龜主要生活在陸地上。 ...
Thumbnail
這張是前年一位學伴,看到網上有張松鼠與蝴蝶的照片,想到我畫的松鼠,於是標註我去看,然後我把它存了起來,那年八月份畫了出來。 構圖也挺有趣味,松鼠看見蝴蝶,眼睛瞪得又圓又大,好像驚訝,又好像覺得新奇,蝴蝶倒是老神在在地自顧自地飛。 如果喜歡我的作品,歡迎隨喜贊助,中年媽媽喬宜思感謝你😊
Thumbnail
這張是前年一位學伴,看到網上有張松鼠與蝴蝶的照片,想到我畫的松鼠,於是標註我去看,然後我把它存了起來,那年八月份畫了出來。 構圖也挺有趣味,松鼠看見蝴蝶,眼睛瞪得又圓又大,好像驚訝,又好像覺得新奇,蝴蝶倒是老神在在地自顧自地飛。 如果喜歡我的作品,歡迎隨喜贊助,中年媽媽喬宜思感謝你😊
Thumbnail
Turtle Graphic的前身是一種設計給小朋友學習的簡易繪圖程式,最初來自於Wally Feurzeig、Seymour Papert和Cynthia Solomon於1967年所創造的Logo編程語言,它是Python內建的繪圖函式庫,我們可以根據函式庫裡面的指令,操控一隻或多隻「小烏龜」在
Thumbnail
Turtle Graphic的前身是一種設計給小朋友學習的簡易繪圖程式,最初來自於Wally Feurzeig、Seymour Papert和Cynthia Solomon於1967年所創造的Logo編程語言,它是Python內建的繪圖函式庫,我們可以根據函式庫裡面的指令,操控一隻或多隻「小烏龜」在
Thumbnail
左邊照片;右邊色鉛筆仿畫 相關文章:色鉛筆作品紀錄|新竹東區成人繪畫班推薦~築藝畫室 距離上次紀錄色鉛筆作品也有段時間,剛好有時間整理作品集,所以想與大家分享鼠與鳥。 底稿與老鼠 這次的底稿還蠻好畫的,線條不多,比較困難的部分就是老鼠,像我畫的就比照片底稿中的老鼠還要胖。 老鼠上色需要細心,才可以
Thumbnail
左邊照片;右邊色鉛筆仿畫 相關文章:色鉛筆作品紀錄|新竹東區成人繪畫班推薦~築藝畫室 距離上次紀錄色鉛筆作品也有段時間,剛好有時間整理作品集,所以想與大家分享鼠與鳥。 底稿與老鼠 這次的底稿還蠻好畫的,線條不多,比較困難的部分就是老鼠,像我畫的就比照片底稿中的老鼠還要胖。 老鼠上色需要細心,才可以
Thumbnail
你好,來自摺紙大笨象先生的問候!在此教學短片中,你將學習完成一隻狐狸。此教學為簡易程度,適合初學者。
Thumbnail
你好,來自摺紙大笨象先生的問候!在此教學短片中,你將學習完成一隻狐狸。此教學為簡易程度,適合初學者。
Thumbnail
#2Y8M #課程紀錄  #水彩 #蠟筆 早上去親子館上親子美勞,主題是「螃蟹🦀️」。秋天到了,就會想到秋蟹,老師選了一個符合時節的主題。 材料:白色圖畫紙、無毒水彩(紅、黃、藍)、蠟筆🖍️ 課程前面説明: 1.介紹「螃蟹🦀️」常見的時節跟特徵,如生的螃蟹是綠色,熟的螃蟹是橘色,有八隻細腳跟
Thumbnail
#2Y8M #課程紀錄  #水彩 #蠟筆 早上去親子館上親子美勞,主題是「螃蟹🦀️」。秋天到了,就會想到秋蟹,老師選了一個符合時節的主題。 材料:白色圖畫紙、無毒水彩(紅、黃、藍)、蠟筆🖍️ 課程前面説明: 1.介紹「螃蟹🦀️」常見的時節跟特徵,如生的螃蟹是綠色,熟的螃蟹是橘色,有八隻細腳跟
Thumbnail
Before / 以創辦人的青蛙為底,搭配比較硬派的字體跟填色。 After / 在原有青蛙的底下加了台灣島,以及點題的等高線/波紋,並搭配較為樸拙的字體。
Thumbnail
Before / 以創辦人的青蛙為底,搭配比較硬派的字體跟填色。 After / 在原有青蛙的底下加了台灣島,以及點題的等高線/波紋,並搭配較為樸拙的字體。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News