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

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

畫布 (Canvas)

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

背景顏色

以下三種方式可以設定畫布的背景顏色:
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)
執行結果皆為設定畫布背景為綠色:

標題

screen.title(titlestring)
  可改變畫布左上角的標題,例如:
screen.title("我的畫布")

視窗大小與位置

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()

前進、後退

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)

移至定點

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)
turtle.setx(x)
  將畫筆移動到指定的x座標。
turtle.sety(y)
  將畫筆移動到指定的y座標。
如下例最後停止的位置和前例相同,但軌跡不同。
turtle.setx(-200)
turtle.sety(200)

回到原點

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)

顯示隱藏畫筆

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)

詢問位置方向

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()

寫字

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"))

畫筆形狀

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

程式範例

為什麼會看到廣告
46會員
36內容數
留言0
查看全部
發表第一個留言支持創作者!
Wei-Jie Weng的沙龍 的其他內容
「繼承」顧名思義就是有一個或多個類別延續了某個類別的特性,就如同在人類社會裡,兒女接收了父母的財產、承襲了上代的技能、延續了前一輩的事業。在Python的語言裡,能夠繼承的特性為類別的屬性與方法,繼承的類別稱為子類別(child class / subclass)或衍伸類別(derived clas
在類別一節中,我們可以用Student類別的實體來存取類別中的name變數、score字典、以及其中的所有方法,這些可以被類別以外的程式碼所直接存取的屬性稱為公有屬性(public attribute)、可以被類別以外的程式碼所直接呼叫的方法稱為公有方法(public method)。
大型程式的開發通常不會由一個人獨力完成,而是將程式依功能拆分成不同的函數或是類別,由不同人協力開發成各個模組,最後再將這些模組導入主程式,或是直接套用現有的模組。模組依來源可以分成三大類: Python內建的模組 外部模組,需從第三方的軟體儲存庫(如PyPI)並安裝使用 程式開發者自行開發的模組
全球公衛教授和公共教育家漢斯.羅斯林(Hans Rosling)在其著名的暢銷書「真確」中,提出了13個關於全球貧富、人口、出生/死亡率、教育、公衛等的「留意認知落差測驗」,回答的人不乏受過良好教育的專業人士,結果顯示,受測者在前12題平均只答對2題,遠不如隨機亂選的黑猩猩(如果黑猩猩會回答問題的話
到目前為止,我們所學習的都是程序性的程式設計(procedural programming),也就是程式碼是透過一連串的指令組成的程序或函數,由上而下依序執行不同的程序或是呼叫函數來完成程式的功能。 Python其實是一種物件導向的程式(object oriented programming, 簡稱
Python提供集合做為其資料結構,它就如同高中數學所學集合的概念,集合的內容一般來說是具有某種特性的事物的整體,例如考試分數及格的群體、數字1到100內的所有奇數、球箱內所有球的顏色等。因此,在一個集合中,每個元素的地位都是相同且無序,並且只能出現一次,集合和集合之間,也可以進行交集、聯集、差集等
「繼承」顧名思義就是有一個或多個類別延續了某個類別的特性,就如同在人類社會裡,兒女接收了父母的財產、承襲了上代的技能、延續了前一輩的事業。在Python的語言裡,能夠繼承的特性為類別的屬性與方法,繼承的類別稱為子類別(child class / subclass)或衍伸類別(derived clas
在類別一節中,我們可以用Student類別的實體來存取類別中的name變數、score字典、以及其中的所有方法,這些可以被類別以外的程式碼所直接存取的屬性稱為公有屬性(public attribute)、可以被類別以外的程式碼所直接呼叫的方法稱為公有方法(public method)。
大型程式的開發通常不會由一個人獨力完成,而是將程式依功能拆分成不同的函數或是類別,由不同人協力開發成各個模組,最後再將這些模組導入主程式,或是直接套用現有的模組。模組依來源可以分成三大類: Python內建的模組 外部模組,需從第三方的軟體儲存庫(如PyPI)並安裝使用 程式開發者自行開發的模組
全球公衛教授和公共教育家漢斯.羅斯林(Hans Rosling)在其著名的暢銷書「真確」中,提出了13個關於全球貧富、人口、出生/死亡率、教育、公衛等的「留意認知落差測驗」,回答的人不乏受過良好教育的專業人士,結果顯示,受測者在前12題平均只答對2題,遠不如隨機亂選的黑猩猩(如果黑猩猩會回答問題的話
到目前為止,我們所學習的都是程序性的程式設計(procedural programming),也就是程式碼是透過一連串的指令組成的程序或函數,由上而下依序執行不同的程序或是呼叫函數來完成程式的功能。 Python其實是一種物件導向的程式(object oriented programming, 簡稱
Python提供集合做為其資料結構,它就如同高中數學所學集合的概念,集合的內容一般來說是具有某種特性的事物的整體,例如考試分數及格的群體、數字1到100內的所有奇數、球箱內所有球的顏色等。因此,在一個集合中,每個元素的地位都是相同且無序,並且只能出現一次,集合和集合之間,也可以進行交集、聯集、差集等
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
十年前,我跟小悟參加了台南政府所舉辦的 24 小時不間斷進食比賽,當年,我以兩分之差,沒擠進金榜。在挑戰時間內,來不及吃狀元糕跟芋頭八寶冰,以致失掉食物王的頭銜。十年後,小悟說,要不要再來回味當年勇?我知道,年輕的我胃袋能撐船,可逝去的青春,最先反映在食慾上。我笑著說不了......
Thumbnail
持著前作的風格,《蜘蛛人:穿越新宇宙》在色彩或畫面的呈現上依舊大膽、前衛,並且嘗試藉由多重宇宙的「優勢」,在成長動畫的既有敘事上,嘗試更多不同的可能性。精彩的安排讓觀看這部作品讓成為十足的享受,並賦予了觀眾再次進場支持的充分動機。
Thumbnail
節目這邊聽 📎錄製時間: 2023.10 汪汪隊立大功! MRT(Mission Readiness Test)是難度最高的國際搜救犬認證! 但是我們有兩位英雄(一人一汪)順利通過這次的認證,拿到了優良的成績! 讓我們歡迎領犬員羅浩芳!就讓她帶著小編、江小姐還有各位聽眾,一起了解這次搜救犬
Thumbnail
這一陣子不少投資標的都在上漲 連成長性沒有科技股強的食品股也在慢慢上升中 今天記錄一下自己食品股大成的最新績效 身為雞肉雙雄的其中一雄 除了飼料、雞肉、雞蛋以外,還跨足了沙拉油、豬肉、海鮮、餐廳等事業體 幾乎可說是一檔食品ETF(還不用付管理費),進去它的官網就可以看到許多不同的事業體
Thumbnail
你現在也許單一個句子可以說得溜,但持續說話覺得尷尬的原因在於:缺乏連接詞。好的連接詞會讓口語表達更精確有力,讓韓國人聽到你說的話不需要猜測意思或重新思考,表達能力也就跟著上升!
Thumbnail
喜歡音樂的羅小咩,不定期將在周六中午12:00與你聊聊戲劇中的音樂,還有音樂中的戲劇。本次介紹:惡作劇之吻、慶餘年、Good Casting、溫柔時光、鋼之鍊金術師這五個戲劇作品的主題曲。
Thumbnail
喜歡音樂的羅小咩,不定期將在周六中午12:00與你聊聊戲劇中的音樂,還有音樂中的戲劇。本次介紹:必娶女人、kill me heal me、錦衣之下、101次求婚、灌籃高手這五個戲劇作品的主題曲。
近期許多地方受到洪水以及颱風的侵襲 但包你發的線路及網路穩定度完全不受到影響 大家可以放心,我們是24小時全年無休不間斷 就算你半夜三點要玩包你發也完全OK 不會像有些系統只在白天開放 而同樣的穩定度也是一大考驗 在這種供電不穩定的情況 也有可能導致其他遊戲斷線 但包你發機房穩定、有備用電源 完全不
Thumbnail
疫情長時間帶來了減少開放性的社交機會,最直接的影響莫過於情緒勒索造成的封閉性失調,感謝國立台灣戲曲學院傑出校友,為身心障礙的大寶寶們帶來一系列精彩的演出,透過精心策劃的舞蹈及雜耍表演,帶給住民體驗了跟以往不同的志工服務內容,見到了久違住民
Thumbnail
每一次TDCA的關愛陪伴,都讓受贈的服務對象感受到滿滿的幸福感,一起協力完成手作皮革鑰匙圈,每一針每一線都在訓練孩子們手眼協調的肢體,透過不同花色皮革來搭配,不僅訓練孩子對色彩的辨識能力,同時也在培養眼界裡的審美觀噢!
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
十年前,我跟小悟參加了台南政府所舉辦的 24 小時不間斷進食比賽,當年,我以兩分之差,沒擠進金榜。在挑戰時間內,來不及吃狀元糕跟芋頭八寶冰,以致失掉食物王的頭銜。十年後,小悟說,要不要再來回味當年勇?我知道,年輕的我胃袋能撐船,可逝去的青春,最先反映在食慾上。我笑著說不了......
Thumbnail
持著前作的風格,《蜘蛛人:穿越新宇宙》在色彩或畫面的呈現上依舊大膽、前衛,並且嘗試藉由多重宇宙的「優勢」,在成長動畫的既有敘事上,嘗試更多不同的可能性。精彩的安排讓觀看這部作品讓成為十足的享受,並賦予了觀眾再次進場支持的充分動機。
Thumbnail
節目這邊聽 📎錄製時間: 2023.10 汪汪隊立大功! MRT(Mission Readiness Test)是難度最高的國際搜救犬認證! 但是我們有兩位英雄(一人一汪)順利通過這次的認證,拿到了優良的成績! 讓我們歡迎領犬員羅浩芳!就讓她帶著小編、江小姐還有各位聽眾,一起了解這次搜救犬
Thumbnail
這一陣子不少投資標的都在上漲 連成長性沒有科技股強的食品股也在慢慢上升中 今天記錄一下自己食品股大成的最新績效 身為雞肉雙雄的其中一雄 除了飼料、雞肉、雞蛋以外,還跨足了沙拉油、豬肉、海鮮、餐廳等事業體 幾乎可說是一檔食品ETF(還不用付管理費),進去它的官網就可以看到許多不同的事業體
Thumbnail
你現在也許單一個句子可以說得溜,但持續說話覺得尷尬的原因在於:缺乏連接詞。好的連接詞會讓口語表達更精確有力,讓韓國人聽到你說的話不需要猜測意思或重新思考,表達能力也就跟著上升!
Thumbnail
喜歡音樂的羅小咩,不定期將在周六中午12:00與你聊聊戲劇中的音樂,還有音樂中的戲劇。本次介紹:惡作劇之吻、慶餘年、Good Casting、溫柔時光、鋼之鍊金術師這五個戲劇作品的主題曲。
Thumbnail
喜歡音樂的羅小咩,不定期將在周六中午12:00與你聊聊戲劇中的音樂,還有音樂中的戲劇。本次介紹:必娶女人、kill me heal me、錦衣之下、101次求婚、灌籃高手這五個戲劇作品的主題曲。
近期許多地方受到洪水以及颱風的侵襲 但包你發的線路及網路穩定度完全不受到影響 大家可以放心,我們是24小時全年無休不間斷 就算你半夜三點要玩包你發也完全OK 不會像有些系統只在白天開放 而同樣的穩定度也是一大考驗 在這種供電不穩定的情況 也有可能導致其他遊戲斷線 但包你發機房穩定、有備用電源 完全不
Thumbnail
疫情長時間帶來了減少開放性的社交機會,最直接的影響莫過於情緒勒索造成的封閉性失調,感謝國立台灣戲曲學院傑出校友,為身心障礙的大寶寶們帶來一系列精彩的演出,透過精心策劃的舞蹈及雜耍表演,帶給住民體驗了跟以往不同的志工服務內容,見到了久違住民
Thumbnail
每一次TDCA的關愛陪伴,都讓受贈的服務對象感受到滿滿的幸福感,一起協力完成手作皮革鑰匙圈,每一針每一線都在訓練孩子們手眼協調的肢體,透過不同花色皮革來搭配,不僅訓練孩子對色彩的辨識能力,同時也在培養眼界裡的審美觀噢!