畫一個心送給心愛的小姐姐,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
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...