使用Python绘制圣诞树教程(附源代码)

news2024/11/16 13:52:33

🤵‍♂️ 个人主页:@艾派森的个人主页

✍🏻作者简介:Python学习者
🐋 希望大家多多支持,我们一起进步!😄
如果文章对你有帮助的话,
欢迎评论 💬点赞👍🏻 收藏 📂加关注+


又是一年一度的圣诞节快到了,作为程序猿那必须露一手,最终效果图如下:

目录

1.turtle库 

2.实现步骤 

(1)导入库

(2)定义基本绘图方法

(3)画树身

(4)画装饰小物件

(5)祝福语

3.完整代码


1.turtle库 

turtle(海龟)是Python重要的标准库之一,它能够进行基本的图形绘制,其概念诞生于1969年。turtle是最有价值的程序设计入门实践库,它是程序设计入门层面最常用的基本绘图库。

turtle的绘图原理:

  • 有一只海龟处于画布正中心,由程序控制在画布上游走;
  • 海龟走过的轨迹形成了绘制的图形
  • 海龟由程序控制,可改变其大小,颜色等
     

2.实现步骤 

(1)导入库

from turtle import *
from random import *
import math

(2)定义基本绘图方法

def Rightdraw(Range,Fd,Right): 
    for i in range(Range): # Range循环次数
        fd(Fd)  # 向前Fd个距离
        right(Right) #在当前行进方向再向右偏转Right度

def Leftdraw(Range,Fd,Left): 
    for i in range(Range): # Range循环次数
        fd(Fd)  # 向前Fd个距离
        left(Left) #在当前行进方向再向右偏转Right度

def changeMypos(x,y,range=heading(),Fd=0):
    penup()
    goto(x, y)
    seth(range)
    fd(Fd)
    pendown()
 
def drawBranch(x,y,size=1):
    changeMypos(x,y)
    Leftdraw(6,3,9)
    seth(0)
    Rightdraw(6,3,9)
    seth(0)
    fd(6)

(3)画树身

# 树顶层
seth(-120)
Rightdraw(10,12,2)
changeMypos(0,185,-60)
Leftdraw(10,12,2)
changeMypos(xcor(),ycor(),-150,10)
# 第一层的波浪
for i in range(4):
    Rightdraw(5,7,15)
    seth(-150)
    penup()
    fd(2)
    pendown()
# 二层
changeMypos(-55,70,-120)
Rightdraw(10,8,5)
changeMypos(50,73,-60)
Leftdraw(10,8,5)
changeMypos(xcor(),ycor(),-120,10)
seth(-145)
pendown()
# 第二层的波浪
for i in range(5):
    Rightdraw(5,9,15)
    seth(-152.5)
    penup()
    fd(3)
    pendown()
# 树三层
changeMypos(-100,0,-120)
Rightdraw(10,6.5,4.5)
changeMypos(80,0,-50)
Leftdraw(10,6,3)
changeMypos(xcor(),ycor(),-120,10)
seth(-145)
# 第三次的波浪
for i in range(6):
    Rightdraw(5,9,15)
    seth(-152)
    penup()
    fd(3)
    pendown()
# 树四层
changeMypos(-120,-55,-130)
Rightdraw(7,10,4)
changeMypos(100,-55,-50)
Leftdraw(7,10,5)
changeMypos(xcor(),ycor(),-120,10)
seth(-155)
# 第四层的波浪
for i in range(7):
    Rightdraw(5,9,13)
    seth(-155)
    penup()
    fd(3)
    pendown()
# 树根
changeMypos(-70,-120,-85)
Leftdraw(3,8,3)
changeMypos(70,-120,-95)
Rightdraw(3,8,3)
changeMypos(xcor(),ycor(),-170,10)
Rightdraw(10,12,2)
# 画树枝
drawBranch(45,-80)
drawBranch(-70,-25)
drawBranch(-20,40)

(4)画装饰小物件

五角星

# 画五角星
def drawStar(x,y,Range,size):
    pensize(1)
    color("red","yellow")
    begin_fill()
    changeMypos(x,y,Range)
    for i in range(5): #画五角星
        forward(10*size)
        right(144)    #五角星的角度
        forward(10*size)
        left(72)    #继续换角度
    end_fill()
    right(126)

雪花

# 绘制雪花
def drawSnow():
    hideturtle()
    speed(0)
    pencolor("white")
    pensize(2)
    for i in range(80): # 雪花数量
        changeMypos(randint(-248,248),randint(-100,248))
        petalNumber = 6 # 雪花花瓣数为6
        snowSize = int(randint(2,10))
        for j in range(petalNumber):
            fd(snowSize)
            backward(snowSize)
            right(360/petalNumber)

圣诞袜子

# 圣诞袜子
def drawSock(x,y,range,size=1):
    # 绘制袜子的白边
    pensize(1)
    changeMypos(x,y,range)
    color("black","white")
    begin_fill()
    fd(20*size)
    circle(3*size,180)
    fd(20*size)
    circle(3*size,180)
    end_fill()
    # 绘制袜子的下半部分
    color("white","red")
    begin_fill()
    startx = x+2*size*math.cos(math.radians(range))
    starty = y+2*size*math.sin(math.radians(range))
    finalx = x+18*size*(math.cos(math.radians(range)))
    finaly = y+18*size*(math.sin(math.radians(range)))
    changeMypos(startx,starty,range-90)
    fd(20*size) # 圆弧距离白边40
    seth(180+range)
    fd(5*size) # 向袜子头延伸10
    circle(7*size,180)  #袜子头处的半圆形
    fd(21*size) #袜子宽42
    seth(90+range)
    d = distance(finalx,finaly)  #找到袜子底部与白边的距离
    fd(d)
    seth(range+180)
    fd(16*size) 
    end_fill()

圣诞帽

# 圣诞帽
def drawHat(x,y,range,size=1):
    # 绘制帽白边
    pensize(1)
    changeMypos(x,y,range)
    color("white","white")
    begin_fill()
    fd(20*size)
    circle(-3*size,180)
    fd(20*size)
    circle(-3*size,180)
    end_fill()
    # 绘制帽子上半部分
    color("white","red")
    begin_fill()
    startx = x+2*size*math.cos(math.radians(range))
    starty = y+2*size*math.sin(math.radians(range))
    finalx = x+18*size*(math.cos(math.radians(range)))
    finaly = y+18*size*(math.sin(math.radians(range)))
    changeMypos(startx,starty,range+90)
    Rightdraw(18,2*size,7)
    seth(190)
    Leftdraw(9,2*size,8)
    goto(finalx,finaly)
    goto(startx,starty)
    end_fill()
    # 绘制圣诞帽上的小球
    changeMypos(startx,starty,range+90)
    Rightdraw(18,2*size,7)
    begin_fill()
    color("white","white")
    circle(-2.5*size)
    end_fill()

彩带

# 绘制彩带
def drawRibbon(x,y,range,size):
        begin_fill()
        color("red","red")
        seth(range+40)
        fd(15*size*math.tan(math.radians(range+40)))
        seth(range+90)
        fd(20/3*size)
        seth(range-140)
        fd(15*size*math.tan(math.radians(range+40)))
        seth(range-90)
        fd(20/3*size)
        end_fill()

糖果

# 圣诞糖果
def drawCandy(x,y,range,size):
    # 绘制糖体
    pensize(1)
    changeMypos(x,y,range)
    color("white","white")
    begin_fill()
    startx = x+2*size*math.cos(math.radians(range))
    starty = y+2*size*math.sin(math.radians(range))
    finalx = x+8*size*(math.cos(math.radians(range)))
    finaly = y+8*size*(math.sin(math.radians(range)))
    changeMypos(startx,starty,range+90,40*size)
    circle(-40/3*size,180)
    circle(-8/3*size,180)
    circle(22/3*size,180)
    goto(finalx,finaly)
    goto(startx,starty)
    end_fill()
    # 绘制下面三条彩带
    color("white")
    changeMypos(startx,starty,range+90)
    fd(10/3*size)
    drawRibbon(xcor(),ycor(),range,size)
    changeMypos(xcor(),ycor(),range+90,13.3*size)
    drawRibbon(xcor(),ycor(),range,size)
    changeMypos(xcor(),ycor(),range+90,13.3*size)
    drawRibbon(xcor(),ycor(),range,size)
    # 绘制弧线段的彩带
    changeMypos(startx,starty,range+90,40*size)
    circle(-13.3*size,55)
    x1 =xcor()
    y1 =ycor()
    begin_fill()
    circle(-13.3*size,80)
    right(75)
    fd(6.3*size)
    right(115)
    circle(7*size,85)
    goto(x1,y1)
    end_fill()

(5)祝福语

# 祝福语
color("dark red","red") #定义字体颜色
penup()
goto(0,-230)
write("Merry Christmas",align ="center",font=("Comic Sans MS",40,"bold"))#定义文字、位置、字体、大小

3.完整代码

from turtle import *
from random import *
import math
 
# 绘图方法
def Rightdraw(Range,Fd,Right): 
    for i in range(Range): # Range循环次数
        fd(Fd)  # 向前Fd个距离
        right(Right) #在当前行进方向再向右偏转Right度
def Leftdraw(Range,Fd,Left): 
    for i in range(Range): # Range循环次数
        fd(Fd)  # 向前Fd个距离
        left(Left) #在当前行进方向再向右偏转Right度
 
# 背景改为黑色
screensize(bg='black') 
 
# 重设海龟位置
def changeMypos(x,y,range=heading(),Fd=0):
    penup()
    goto(x, y)
    seth(range)
    fd(Fd)
    pendown()
 
def drawBranch(x,y,size=1):
    changeMypos(x,y)
    Leftdraw(6,3,9)
    seth(0)
    Rightdraw(6,3,9)
    seth(0)
    fd(6)
 
# 画五角星
def drawStar(x,y,Range,size):
    pensize(1)
    color("red","yellow")
    begin_fill()
    changeMypos(x,y,Range)
    for i in range(5): #画五角星
        forward(10*size)
        right(144)    #五角星的角度
        forward(10*size)
        left(72)    #继续换角度
    end_fill()
    right(126)
 
# 绘制雪花
def drawSnow():
    hideturtle()
    speed(0)
    pencolor("white")
    pensize(2)
    for i in range(80): # 雪花数量
        changeMypos(randint(-248,248),randint(-100,248))
        petalNumber = 6 # 雪花花瓣数为6
        snowSize = int(randint(2,10))
        for j in range(petalNumber):
            fd(snowSize)
            backward(snowSize)
            right(360/petalNumber)
 
# 圣诞袜子
def drawSock(x,y,range,size=1):
    # 绘制袜子的白边
    pensize(1)
    changeMypos(x,y,range)
    color("black","white")
    begin_fill()
    fd(20*size)
    circle(3*size,180)
    fd(20*size)
    circle(3*size,180)
    end_fill()
    # 绘制袜子的下半部分
    color("white","red")
    begin_fill()
    startx = x+2*size*math.cos(math.radians(range))
    starty = y+2*size*math.sin(math.radians(range))
    finalx = x+18*size*(math.cos(math.radians(range)))
    finaly = y+18*size*(math.sin(math.radians(range)))
    changeMypos(startx,starty,range-90)
    fd(20*size) # 圆弧距离白边40
    seth(180+range)
    fd(5*size) # 向袜子头延伸10
    circle(7*size,180)  #袜子头处的半圆形
    fd(21*size) #袜子宽42
    seth(90+range)
    d = distance(finalx,finaly)  #找到袜子底部与白边的距离
    fd(d)
    seth(range+180)
    fd(16*size) 
    end_fill()
 
# 圣诞帽
def drawHat(x,y,range,size=1):
    # 绘制帽白边
    pensize(1)
    changeMypos(x,y,range)
    color("white","white")
    begin_fill()
    fd(20*size)
    circle(-3*size,180)
    fd(20*size)
    circle(-3*size,180)
    end_fill()
    # 绘制帽子上半部分
    color("white","red")
    begin_fill()
    startx = x+2*size*math.cos(math.radians(range))
    starty = y+2*size*math.sin(math.radians(range))
    finalx = x+18*size*(math.cos(math.radians(range)))
    finaly = y+18*size*(math.sin(math.radians(range)))
    changeMypos(startx,starty,range+90)
    Rightdraw(18,2*size,7)
    seth(190)
    Leftdraw(9,2*size,8)
    goto(finalx,finaly)
    goto(startx,starty)
    end_fill()
    # 绘制圣诞帽上的小球
    changeMypos(startx,starty,range+90)
    Rightdraw(18,2*size,7)
    begin_fill()
    color("white","white")
    circle(-2.5*size)
    end_fill()
 
# 绘制彩带
def drawRibbon(x,y,range,size):
        begin_fill()
        color("red","red")
        seth(range+40)
        fd(15*size*math.tan(math.radians(range+40)))
        seth(range+90)
        fd(20/3*size)
        seth(range-140)
        fd(15*size*math.tan(math.radians(range+40)))
        seth(range-90)
        fd(20/3*size)
        end_fill()
 
# 圣诞糖果
def drawCandy(x,y,range,size):
    # 绘制糖体
    pensize(1)
    changeMypos(x,y,range)
    color("white","white")
    begin_fill()
    startx = x+2*size*math.cos(math.radians(range))
    starty = y+2*size*math.sin(math.radians(range))
    finalx = x+8*size*(math.cos(math.radians(range)))
    finaly = y+8*size*(math.sin(math.radians(range)))
    changeMypos(startx,starty,range+90,40*size)
    circle(-40/3*size,180)
    circle(-8/3*size,180)
    circle(22/3*size,180)
    goto(finalx,finaly)
    goto(startx,starty)
    end_fill()
    # 绘制下面三条彩带
    color("white")
    changeMypos(startx,starty,range+90)
    fd(10/3*size)
    drawRibbon(xcor(),ycor(),range,size)
    changeMypos(xcor(),ycor(),range+90,13.3*size)
    drawRibbon(xcor(),ycor(),range,size)
    changeMypos(xcor(),ycor(),range+90,13.3*size)
    drawRibbon(xcor(),ycor(),range,size)
    # 绘制弧线段的彩带
    changeMypos(startx,starty,range+90,40*size)
    circle(-13.3*size,55)
    x1 =xcor()
    y1 =ycor()
    begin_fill()
    circle(-13.3*size,80)
    right(75)
    fd(6.3*size)
    right(115)
    circle(7*size,85)
    goto(x1,y1)
    end_fill()
 
setup(500,500,startx = None,starty = None)
title("Merry Christmas")
speed(0)
pencolor("green")
pensize(10)
hideturtle()
changeMypos(0,185,0)
 
 
# 树顶层
seth(-120)
Rightdraw(10,12,2)
changeMypos(0,185,-60)
Leftdraw(10,12,2)
changeMypos(xcor(),ycor(),-150,10)
# 第一层的波浪
for i in range(4):
    Rightdraw(5,7,15)
    seth(-150)
    penup()
    fd(2)
    pendown()
# 二层
changeMypos(-55,70,-120)
Rightdraw(10,8,5)
changeMypos(50,73,-60)
Leftdraw(10,8,5)
changeMypos(xcor(),ycor(),-120,10)
seth(-145)
pendown()
# 第二层的波浪
for i in range(5):
    Rightdraw(5,9,15)
    seth(-152.5)
    penup()
    fd(3)
    pendown()
# 树三层
changeMypos(-100,0,-120)
Rightdraw(10,6.5,4.5)
changeMypos(80,0,-50)
Leftdraw(10,6,3)
changeMypos(xcor(),ycor(),-120,10)
seth(-145)
# 第三次的波浪
for i in range(6):
    Rightdraw(5,9,15)
    seth(-152)
    penup()
    fd(3)
    pendown()
# 树四层
changeMypos(-120,-55,-130)
Rightdraw(7,10,4)
changeMypos(100,-55,-50)
Leftdraw(7,10,5)
changeMypos(xcor(),ycor(),-120,10)
seth(-155)
# 第四层的波浪
for i in range(7):
    Rightdraw(5,9,13)
    seth(-155)
    penup()
    fd(3)
    pendown()
# 树根
changeMypos(-70,-120,-85)
Leftdraw(3,8,3)
changeMypos(70,-120,-95)
Rightdraw(3,8,3)
changeMypos(xcor(),ycor(),-170,10)
Rightdraw(10,12,2)
# 画树枝
drawBranch(45,-80)
drawBranch(-70,-25)
drawBranch(-20,40)
 
# 添加挂件
drawHat(-25,175,-10,2.5)
drawCandy(-75,-50,-10,1)  
drawCandy(10,40,-10,1.2)
drawStar(110,-90,80,1)
drawStar(-120,-100,50,1)
drawStar(-90,-50,20,1)
drawStar(90,-25,30,1)
drawSock(10,-35,-10,2)
drawSock(-40,100,10,1)
drawStar(-20,40,30,1)
drawStar(10,120,90,1)
 
# 打印祝福语
color("dark red","red") #定义字体颜色
penup()
goto(0,-230)
write("Merry Christmas",align ="center",font=("Comic Sans MS",40,"bold"))#定义文字、位置、字体、大小
 
# 调用下雪的函数
drawSnow()
 
done()

以上就是本次圣诞树的画法教程,其中里面的一些文字、颜色、参数等大家可自行调整绘制出自己喜欢的圣诞树~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/107965.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt Creator 运行LVGL模拟器

windows下用Qt Creator运行LVGL 8.2 背景 最近在学习LVGL,手头又没有硬件,好多网上资料介绍了如何在PC端模拟,纯C语言实现的库模拟的话也不会复杂,恰巧本人熟悉Qt Creator,那就用这个环境模拟吧,网上搜索…

为什么企业传统网络访问海外应用程序不稳定、速度慢?怎么解决?

外贸、游戏等行业经常会有跨网数据访问的需求,并且访问慢、卡是常见的问题。这其中主要的原因是网络访问速度与物理距离有直接关系。刨除距离原因,还有哪些因素影响了我们的访问呢?那么访问国站慢的影响因素有哪些? 在中国的国内用户,使用应…

下载安装npm,配置环境变量详细教程

要在本地运行项目,就需要安装npm,其次还需要配置项目依赖node-modules。今天我们就先安装npm npm下载安装一、安装1、下载2、勾选同意,下一步3、默认的存储位置即可,next4、不用勾选,next5、点击install6、等待安装完成…

通过 Mito 在 Python 中使用电子表格

在本文中,您将学习如何使用这个强大的库,该库能够自动执行某些 Pandas 任务并以非常快速的方式执行数据分析。 Mitosheet是什么? Mitosheet 是 Python 中可用的众多库之一,它实际上是 Python 和电子表格之间的融合,大大加快了数据分析过程。 安装过程 您可以安装在分析…

《Python多人游戏项目实战》第五节 断线重连

目录 5.1 模拟弱网状态 5.2 断线重连 5.3 优化玩家名称显示 5.4 完整代码下载地址 导致客户端和服务端断开连接的原因可能有以下三种: 服务端主动关闭连接。客户端窗口关闭,玩家退出游戏。客户端所在网络不给力(也叫做弱网)&…

Redis - Redis持久化:AOF和RDB

1. 为什么要持久化 Redis是内从数据库,宕机后数据会丢失;Redis重启后,为了快速恢复数据,提供了持久化机制;Redis有两种持久化方式:RDB和AOF,这也是Redis无畏宕机与快速恢复数据的杀手锏。 注意…

全球代表供应商!腾讯安全NDR再获Gartner认可

近日,国际研究机构Gartner发布了2022年《Market Guide for Network Detection and Response》(《网络检测和响应(NDR)市场指南》)(以下简称《报告》),腾讯安全被Gartner列为全球NDR市…

非零基础自学Golang 第17章 HTTP编程(上) 17.3 爬虫框架gocolly 17.3.1 gocolly简介

非零基础自学Golang 文章目录非零基础自学Golang第17章 HTTP编程(上)17.3 爬虫框架gocolly17.3.1 gocolly简介第17章 HTTP编程(上) 17.3 爬虫框架gocolly 我们在之前学习了如何使用标准库实现HTTP爬虫【其实也不算,就实现了简单的请求,但是爬虫不就是这…

别乱用了,用新的。Go SliceHeader 和 StringHeader 将会被废弃!

大家好,我是煎鱼。Go 语言中有个很经典的 (Slice|String)Header,经常出现在大家视野中,为此我写了《Go SliceHeader 和 StringHeader,你知道吗?》给大家介绍,避免被面试官卷到。以重点来讲,Slic…

Alibaba送给开发人员的“礼物”:Java架构成长笔记,深入内核,拒绝蒙圈

提起阿里,行外人联想到的关键词无非是“交易”、“淘宝”、“支付宝”,但对于程序员来说,阿里庞大的技术体系才是最吸引人的。实际上阿里作为国内一线互联网公司的头把交椅,内部的技术体系和发展都是备受关注的,对于程…

【javaScript总结归纳】字符串常用方法总结

前言 在js中我们对字符串进行一部分截取,可以使用slice()函数截取,也可以直接用substring()函数来截取,但是截取也有可能出bug const str小𠮷和小𧨁今天吃了50块钱的KFC console.log(str.slice(0,5)); 可以在控制台看…

评估EtherCAT从站节点解决方案

本系列博客文章的第1部分介绍了用于C2000™微控制器的EtherCAT从站堆栈解决方案的市场机遇,以及从站堆栈开发快速入门的三个阶段指南。第2部分详细说明了TIC2000 MCU EtherCAT实施的特点和优势。第3部分分别介绍了使用EtherCAT从站和C2000 Delfino MCU controlCARD套…

Linux【windows使用xshell连接本地虚拟机】【Mac使用terminal连接本地虚拟机】

文章目录对于本地虚拟机的配置使用Mac的terminal的ssh连接本地虚拟机windows使用xshell连接本地虚拟机对于本地虚拟机的配置 IP地址和子网掩码。 在虚拟机中使用ping命令判断虚拟机到宿主机是否是连通的。(不通的话,关闭Windows防火墙,再试一…

python+pyhyper实现识别图片中的车牌号

背景 最近领导给布置了一个基于图片识别车牌号的工具开发任务,然后就去研究实现逻辑,自己根据opencv写了一个小demo,发现不仅速度慢而且成功率极低。然后,就找到了Hyperlpr开源项目。 环境搭建 排雷1:有教程说在git…

动态内存管理易错点+分析例题

复习一下: 常见的错误: 1.可能返回的是空指针 2.对动态开辟的内存越界访问 3.非动态开辟内存却用free释放 4.使用free释放动态开辟内存的一部分 5.free多次释放 如果加了pNULL的话 free(p)相当于啥也不干 程序起码不会崩掉 6.动…

RabbitMQ、RocketMQ、Kafka延迟队列实现

延迟队列在实际项目中有非常多的应用场景,最常见的比如订单未支付,超时取消订单,在创建订单的时候发送一条延迟消息,达到延迟时间之后消费者收到消息,如果订单没有支付的话,那么就取消订单。 那么&#xf…

Proteus8仿真:51单片机IrLink红外发送加接受模块的使用

51单片机IrLink红外的使用元器件原理图部分代码单片机1发送main.c单片机2接受main.c工程文件元器件 元器件名称51单片机AT89C51红外收发IRLINK按键BUTTON发光二极管LED-RED时钟激励源DCLOCK与门74LS08示波器 原理图部分 关于IRLINK的使用: 在Proteus上就是一个红外…

数据中台选型前必读(七):解读数据服务的四大关键技术

在前面的文章中,我们介绍了“数据服务”对于“数据中台”的重要性,并讲解了数据服务解决的问题及其核心功能,在这个系列的最终篇我们展开聊聊数据服务的四大关键技术,然后总结一下数据服务架构的三大关键点,希望对大家…

JSP ssh培训管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 JSP ssh 培训管理系统是一套完善的web设计系统(系统采用ssh框架进行设计开发),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Mye…

校园打架行为识别检测 yolov7

校园打架行为识别检测系统基于python基于yolov7深度学习框架边缘分析技术,自动对校园、广场等区域进行实时监测,当监测到有人打架斗殴时,系统立即抓拍存档语音提醒,并将打架行为回传给学校后台,提醒及时处理打架情况。…