畫一個心送給心愛的小姐姐,Python繪圖庫Turtle

来源:https://www.cnblogs.com/huangguifeng/archive/2019/11/07/11816423.html
-Advertisement-
Play Games

Python繪圖庫Turtle Turtle介紹 Turtle是Python內嵌的繪製線、圓以及其他形狀(包括文本)的圖形模塊。 一個Turtle實際上是一個對象,在導入Turtle模塊時,就創建了對象,然後,可以調用Turtle對象的各種方法完成不同的操作。 當創建一個Turtle對象時,它的位置 ...


Python繪圖庫Turtle

Turtle介紹

Turtle是Python內嵌的繪製線、圓以及其他形狀(包括文本)的圖形模塊。

一個Turtle實際上是一個對象,在導入Turtle模塊時,就創建了對象,然後,可以調用Turtle對象的各種方法完成不同的操作。

當創建一個Turtle對象時,它的位置被設定在(0,0)處——視窗的中心,而且它的方向被設置為向右。Turtle模塊用筆來繪製圖形,就像在現實的紙上畫圖寫字。當移動筆的時候就會按著移動方向畫線。

海龜圖坐標詳解

海龜圖畫圖定位採用坐標系,坐標系的(0,0)位置在圖紙的中間點。其他的跟我們在數學中學的坐標是一樣的,分成四個象限。

如下圖所示:

 

 

 

 

 

 

 

Turtle基礎

1.    畫布

設置畫布大小與背景顏色

方法1:

turtle.screensize(canvwidth=None, canvheight=None, bg=None)

參數:分別為畫布的寬(單位像素), 高, 背景顏色。

方法2:

turtle.setup(width=0.5, height=0.75, startx=None, starty=None)

參數:width, height: 輸入寬和高為整數時, 表示像素; 為小數時, 表示占據電腦屏幕的比例,(startx, starty): 這一坐標表示矩形視窗左上角頂點的位置, 如果為空,則視窗位於屏幕中心

2.    畫筆

畫筆設置:

  1. 畫筆寬度 turtle.pensize(int)  參數是一個整形
  2. 畫筆顏色turtle.pencolor("black") 參數可以是字元串如"green", "red",也可以是RGB 3元組
  3. 畫筆速度 turtle.speed(speed) 設置畫筆移動速度,畫筆繪製的速度範圍[0,10]整數,數字越大越快。

3.    繪圖命令

海龜繪圖命令可以劃分為3種:一種為畫筆運動命令,一種為畫筆控制命令,還有一種是全局控制命令。

畫筆運動命令:

命令

說明

turtle.forward(distance)/fd()

向當前畫筆方向移動distance像素長度

turtle.backward(distance)

向當前畫筆相反方向移動distance像素長度

turtle.right(degree)

順時針移動degree°

turtle.left(degree)

逆時針移動degree°

turtle.pendown()

移動時繪製圖形,預設時也為繪製

turtle.goto(x,y)

將畫筆移動到坐標為x,y的位置

turtle.penup()

提起筆移動,不繪製圖形,用於另起一個地方繪製

turtle.circle()

畫圓,半徑為正(負),表示圓心在畫筆的左邊(右邊)畫圓

setx( )

將當前x軸移動到指定位置

sety( )

將當前y軸移動到指定位置

setheading(angle)/seth(angle)

設置當前朝向為angle角度

home()

設置當前畫筆位置為原點,朝向東。

dot(r)

繪製一個指定直徑和顏色的圓點

 

 

畫筆控制命令:

命令

說明

turtle.fillcolor(colorstring)

繪製圖形的填充顏色

turtle.color(color1, color2)

同時設置pencolor=color1, fillcolor=color2

turtle.filling()

返回當前是否在填充狀態

turtle.begin_fill()

準備開始填充圖形

turtle.end_fill()

填充完成

turtle.hideturtle()

隱藏畫筆的turtle形狀

turtle.showturtle()

顯示畫筆的turtle形狀

turtle.begin_poly()

記錄畫筆的位置

turtle.get_poly()

獲取畫筆的位置

全局控制命令:

命令

說明

turtle.clear()

清空turtle視窗,但是turtle的位置和狀態不會改變

turtle.reset()

清空視窗,重置turtle狀態為起始狀態

turtle.undo()

撤銷上一個turtle動作

turtle.isvisible()

返回當前turtle是否可見

stamp()

複製當前圖形

turtle.write(s ,font=("font-name",font_size,"font_type")])

寫文本,s為文本內容,font是字體的參數,分別為字體名稱,大小和類型;font為可選項,font參數也是可選項

turtle.mainloop()

繪製完成後不關閉視窗

 

案例:五角星

 

 

 

 

五角星畫法:

五角星每一個內角為36°,假如以海龜所在位置為起點先畫一條橫線,那麼畫到第一個角的時候需要拐彎可以使用 turtle.right()順時針,turtle.left() 逆時針旋轉畫筆

 

如果使用順時針旋轉  180°-36°=144°

如果使用逆時針旋轉  180°+36°=216°

 

五個角即迴圈五次即可

 

import turtle

 

turtle.pensize(3) # 畫筆大小

turtle.pencolor("yellow") # 畫筆顏色

turtle.fillcolor("red") # 填充顏色

turtle.begin_fill() # 開始填充

for _ in range(5): # 五角星迴圈五次

turtle.forward(200) # 五角星的邊長200像素

turtle.left(144) # 畫筆旋轉角度

turtle.end_fill() # 填充完成

 

turtle.mainloop() # 不關閉視窗

 

 

 

 

案例:愛心

 

 

 

 

 

說明:桃心畫法

 

 

 

 

 

 

 

def draw_heart(r, angle=45):
    """
   
:param r: 桃心圓的半徑
   
:param angle: 起始畫筆角度
   
:return: 返回桃心底部尖點坐標
    """
   
turtle.begin_fill()  # 開始填充
   
turtle.seth(0)
    turtle.seth(angle)  # 設置畫筆方向
   
turtle.circle(-r, 180)  # 逆時針畫半圓
   
turtle.fd(2 * r)  # 向前移動
   
turtle.begin_poly()  # 記錄畫筆的位置
   
x, y = turtle.get_poly()[0]  # 獲取畫筆的位置
   
turtle.right(90)  # 逆時針旋轉畫筆
   
turtle.fd(2 * r)  # 向前移動
   
turtle.circle(-r, 180)
    turtle.end_fill()  # 填充結束
   
return x, y

 

 

 

完整代碼查看附件

 

 

 

import turtle

 

turtle.setup(1200, 600)  # 視窗大小

 

# 畫心

 

 

turtle.color("black", "red")

turtle.pensize(2)

turtle.speed(10)

turtle.up()  # 提起畫筆

turtle.goto(0, 50)

 

turtle.down()

 

 

def draw_heart(r, angle=45):

    """

    :param r: 桃心圓的半徑

    :param angle: 起始畫筆角度

    :return: 返回桃心底部尖點坐標

    """

    turtle.begin_fill()  # 開始填充

    turtle.seth(0)

    turtle.seth(angle)  # 設置畫筆方向

    turtle.circle(-r, 180)  # 逆時針畫半圓

    turtle.fd(2 * r)  # 向前移動

    turtle.begin_poly()  # 記錄畫筆的位置

    x, y = turtle.get_poly()[0]  # 獲取畫筆的位置

    turtle.right(90)  # 逆時針旋轉畫筆

    turtle.fd(2 * r)  # 向前移動

    turtle.circle(-r, 180)

    turtle.end_fill()  # 填充結束

    return x, y

 

 

# 畫桃心

x_y = []

start_x = 0

for _ in range(4):

    turtle.goto(start_x, 50)

    turtle.down()  # 放下筆

    x_y.append(draw_heart(8))

    start_x += 50

    turtle.up()  # 提起畫筆

 

 

# 畫葉子

def draw_flower(x, y):

    """

    畫桃心下的花

    :param x: 桃心尖底的x

    :param y: 桃心尖底的y

    :return:

    """

    turtle.up()

    turtle.goto(x, y)

    turtle.seth(0)  # 恢復畫筆向右

    turtle.seth(-90)

    turtle.down()

    turtle.fd(60)

    turtle.goto(x, y)

    turtle.right(60)

    turtle.fd(20)

    turtle.left(90)

    turtle.fd(10)

    turtle.left(120)

    turtle.fd(20)

    turtle.up()

    turtle.goto(x, y)

    turtle.seth(0)  # 恢復畫筆向右

    turtle.seth(-115)

    turtle.down()

    turtle.fd(25)

    turtle.up()

    turtle.goto(x, y)

    turtle.seth(0)  # 恢復畫筆向右

    turtle.seth(-10)

    turtle.down()

    turtle.fd(20)

    turtle.right(90)

    turtle.fd(8)

    turtle.right(120)

    turtle.fd(20)

    turtle.goto(x, y)

    turtle.seth(-60)

    turtle.fd(20)

    turtle.up()

 

 

for x, y in x_y:

    draw_flower(x, y)

 

# 畫小人物

turtle.up()

turtle.goto(-200, -50)

turtle.down()

turtle.seth(0)  # 恢復畫筆向右,好控制方向

turtle.seth(45)

turtle.fd(40)

turtle.begin_poly()  # 記錄畫筆的位置,腳叉的位置

x, y = turtle.get_poly()[0]  # 獲取畫筆的位置

turtle.right(90)

turtle.fd(35)

turtle.goto(x, y)

turtle.left(135)

turtle.fd(90)

turtle.seth(0)

turtle.circle(30)  # 畫圓

turtle.goto(x, y + 60)  # 手的位置

turtle.fd(40)

turtle.circle(30, 70)  # 畫圓,拿花手的弧度

turtle.seth(0)

turtle.up()

turtle.goto(x, y + 50)  # 手的位置

turtle.down()

turtle.fd(50)

turtle.begin_poly()  # 記錄手的位置等下畫花需要用

f_x, f_y = turtle.get_poly()[0]

 

# 眼睛

turtle.up()

turtle.goto(x - 15, y + 120)  # 眼睛的位置

turtle.down()

turtle.pensize(4)

turtle.seth(45)

turtle.circle(-10, 70)  # 畫圓弧,拿花手的弧度

turtle.dot(10)  # 眼睛畫圓

turtle.up()

 

turtle.goto(x + 10, y + 120)  # 眼睛的位置

turtle.down()

turtle.pensize(4)

turtle.seth(45)

turtle.circle(-10, 70)  # 畫圓弧,拿花手的弧度

turtle.dot(10)  # 眼睛   畫圓

turtle.up()

 

# 嘴巴

turtle.goto(x, y + 105)  # 眼睛的位置

turtle.down()

turtle.circle(10, 70)  # 畫圓弧,拿花手的弧度

 

# 畫里拿的花葉子部分

turtle.pensize(3)  # 將畫筆大小

turtle.up()

turtle.goto(f_x, f_y)  # 手的位置

turtle.left(20)

turtle.down()

turtle.fd(60)

turtle.pensize(2)  # 將畫筆調小

turtle.begin_poly()  # 記錄手的位置等下畫花需要用

x, y = turtle.get_poly()[0]

turtle.backward(80)

turtle.up()

turtle.goto(x, y)

turtle.down()

turtle.right(90)

turtle.fd(20)

turtle.right(90)

turtle.fd(8)

turtle.right(120)

turtle.fd(25)

turtle.right(200)

turtle.fd(25)

turtle.up()

turtle.goto(x, y)

turtle.down()

turtle.right(60)

turtle.fd(25)

turtle.goto(x, y)

turtle.right(40)

turtle.fd(25)

turtle.left(90)

turtle.fd(8)

turtle.left(110)

turtle.fd(25)

 

turtle.goto(f_x + 34, f_y + 75)

draw_heart(8, angle=20)  # 手裡拿的桃心

 

# 寫文字

turtle.up()

turtle.goto(150, 200)

turtle.pencolor("PINK")  # 畫筆顏色

turtle.write("TO: 所有同學", font=("方正舒體", 30, 'normal'))

turtle.goto(180,140)

turtle.write("送給棒棒的你", font=("方正舒體", 30, 'normal'))

 

turtle.hideturtle()

turtle.mainloop()

 

 

喜歡Python的同學掃碼加我喲!!!!!

 

 

 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 文章主人公:小明,就職於某互聯網公司,從事後端開發工作。最近小明收到通知公司需要開發一款《證件照》應用,需要徵集架構方案,主要功能包括: 小明雖然從事後端開發工作,但是一直很關註架構這方面的知識,以往都是開發大佬們架構好的應用現在有機會自己去實踐下,打算把自己學到的知識應用於實際案例中來。 小明的腦 ...
  • Python win32com模塊 合併文件夾內多個docx文件為一個docx #!/usr/bin/env python # -*- coding: utf-8 -*- from win32com.client import Dispatch import os,sys #import panda ...
  • set介面 java.util.Set 介面和 java.util.List 介面一樣,同樣繼承自 Collection 介面,它與 Collection 介面中的方 法基本一致,但是set介面中元素無序,並且不重覆 分類 1.HashSet集合 2.LinkedHashSet集合 HashSet集 ...
  • day one 演算法是充分利用解題環境所提供的基本操作,對輸入數據進行 逐步加工、變換和處理,從而達到解決問題的目的。 電腦的基本功能操作包括以下四個方面: 邏輯運算:與、或、非; 算術運算:加、減、乘、除; 數據比較:大於、小於、等於、不等於、大於等於、小於等於; 數據傳送:輸入、輸出、賦值。 ...
  • 1.首先是對vs2017這款軟體的使用 1.VS中的scanf()這個函數的使用問題 直到這次寫代碼我才知道VS中用scanf是會被警告的,VS中正規的類似於scanf()函數的輸入函數是scanf_s()只有使用這個函數你才不會報錯,它有三個參分別是數據類型,地址,最大存儲量, 還有兩種方法 第一 ...
  • 寶塔官方建議是純凈的系統,我使用docker運行一個ubuntu容器,模擬一個純凈的系統,這樣也不會影響到我的其他服務。 docker run --name baota -id -p 8888:8888 ubuntu docker exec -it baota bashapt-get updatea ...
  • 一個程式就是一個世界,有很多對象(變數) Golang 語言面向對象編程說明 1) Golang 也支持面向對象編程(OOP),但是和傳統的面向對象編程有區別,並不是純粹的面向對 象語言。所以我們說 Golang 支持面向對象編程特性是比較準確的。 2) Golang 沒有類(class),Go 語 ...
  • 雙11臨近的我發現自己真的很窮很窮很窮(重要的問題說三遍)…… 貧窮催人上進。於是我就尋思著在空閑時間自己搗鼓一下錢生錢的游戲是怎麼玩的,畢竟就算註定做韭菜也要做一根有知識有理想的韭菜。 第一個要玩的模型就是股票交易中的均線黃金交叉。 作為一個基礎的韭菜一定聽說過均線黃金交叉原則,也就是說當短期移動 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...