当前位置: 首页 > news >正文

【圣诞节限定】教你用Python画圣诞树,做个浪漫的程序员

最近在各大社交平台看到好多圣诞树,看到大佬们画的圣诞树一个比一个精致,我也特别想尝试画一棵特别的圣诞树。下面是我画的一棵简易的圣诞树,虽然和网络上大佬们的圣诞树相比不是很精致,但是对于萌新们来说,画这样一棵简易的圣诞树还是非常轻松的。

ps:重要的不是圣诞树,重要的是你的心意哦~ 

  

目录

一、让我们先来学习Python画图小工具——Turtle(小海龟) 

1.1 Turtle画板 

1.2 Turtle画笔 

1.3 Turtle画图

1.4 Turtle填色

1.5 Turtle写字

二、在了解画图的基本原理后,让我们一起为她画一棵圣诞树叭 

2.1 画一棵最简单的小树

2.2 画一棵豪华圣诞树


一、让我们先来学习Python画图小工具——Turtle(小海龟) 

小海龟(Turtle)是Python中画图的一个重要的包,里面包含丰富的画图工具以及画图的各种功能,当你学会了用Turtle画图后,你可以画任何你想画的图案,此时你就可以在圣诞树上添加你的装饰,把一棵简易的圣诞树变成精致的圣诞树了哈哈哈。是不是已经迫不及待啦,那就让我们一起来看看叭~

1.1 Turtle画板 

Turtle的画板大小可以用turtle.screensize()函数来设置:

turtle.screensize(width,height,bg):设置画板的大小,包含长和宽,width为宽,height为高,bg为画布颜色

1.2 Turtle画笔 

Turtle的画笔有几个常用的函数,例如:

①turtle.penup():抬起画笔,此时移动画笔不会在画布上留下痕迹哦

②turtle.pendown():放下画笔,与turtle.penup相对应,放下画笔后就可以继续画画了(放下画笔后画画会在画布上留下痕迹)

③turtle.pensize():控制画笔的大小(可以根据需求自行定义画笔的大小哦)

④turtle.pencolor():控制画笔的颜色(可以自己在网上查阅所有python可以使用的颜色,python里面可以用的颜色有很多的哦)

⑤turtle.hideturtle():隐藏画笔(隐藏画笔以后画图时画笔就看不到了)

1.3 Turtle画图

在画图的过程中,我们经常要使用一些简单的移动函数:

①turtle.forward(x):将画笔向前移动x个像素(x可以理解为距离)

②turtle.backward(x):将画笔向后退x个像素(x可以理解为距离)

③turtle.left(n):将画笔向左旋转n度

④turtle.right(n):将画笔向右旋转n度

⑤turtle.speed():设置画笔画图的速度(1~10递增,0最快)

1.4 Turtle填色

在画好图后,我们经常需要对其进行填色,这里可以用turtle.fillcolor()函数,括号里写入你想填充的颜色即可。

在使用turtle.fillcolor()函数要注意其基本格式为:

turtle.beginfill()     #开始填充

turtle.fillcolor()      #输入填充的颜色

turtle.endfill()        #结束填充

1.5 Turtle写字

在完成整个画图后,我们还需要最重要的一步,那就是写给那个她的祝福语,这才是画图的意义,在这里,我们用turtle.write()函数进行写字:

turtle.write(" ",move,align,font):

第一个位置双引号内填入要写的字,快写上你想对她说的祝福吧

move(可选):在默认情况下,move为false。如果move为true,则笔将移动到右下角

align(可选):可取值是left即左、center即中、right即右之一,是字符串格式

font(可选):字体三元组(fontname、fontsize、fonttype),fontname即字体名称(字符串格式,如“宋体”),fontsize即字体大小),fonttype即字体类型如:normal(普通)、bold(粗体)、italic(斜体)

二、在了解画图的基本原理后,让我们一起为她画一棵圣诞树叭 

经过上面的学习,相信你一定迫不及待想要尝试了吧,让我们一起打开Pycharm,为她定做一棵特别的圣诞树吧!

可以参考我写的简易圣诞树哦~

2.1 画一棵最简单的小树

这是一棵非常非常简易的小小圣诞树哈哈哈~

让我们一起来看看这颗小小的圣诞树如何构造出来的叭~

import turtle as t
import random as r
def treet(d,s):      #运用递归的方法画圣诞树
    t.hideturtle()              #隐藏画笔
    t.pencolor('limegreen')     #画笔颜色置为绿色,用来画树
    t.pensize(5)                #画笔大小为5
    t.speed(0)                  #最快速度画树(其实挺慢的)
    if d<=0:
        return
    t.forward(s)
    treet(d-1,s*0.8)
    t.right(120)
    treet(d-3,s*0.5)
    t.right(120)
    treet(d-3,s*0.5)
    t.right(120)
    t.backward(s)
if __name__ == '__main__':      #主函数
    t.up()
    t.goto(0,-110)
    t.down()
    t.left(90)
    treet(10,60)
    t.done()  

2.2 画一棵豪华圣诞树

让我们先来看看效果图叭~

话不多说~直接上技术~

import turtle as t  
import random as r
def star():     #画圣诞树顶的大星星
    t.hideturtle()      #隐藏画笔
    t.pensize(2)        #给画笔设置大小
    t.pencolor("gold")  #给画笔设置颜色,'gold'表示金色
    t.up()              #提起画笔,画笔移动时不会画画
    t.forward(5)        #将画笔向前移5个像素(此时画笔方向向右,即向右移动5个像素)
    t.down()            #画笔放下,画笔移动时会产生轨迹
    t.begin_fill()      #给星星填充颜色
    for i in range(5):  #因为是五角星,所以要循环五次画五个角
        t.forward(20)
        t.right(144)
        t.forward(20)
        t.left(72)
    t.fillcolor('yellow')   #设置填充的颜色
    t.end_fill()
    return
def stars():          #画圣诞树上的小星星
    t.hideturtle()       #隐藏画笔
    t.speed(0)           #设置画画速度,0为最快速
    t.pensize(5)         #设置画笔大小
    for i in range(5):   #循环五次画五个角,与画大星星一样
        t.forward(5)
        t.right(144)
        t.forward(5)
        t.left(72)
    return
def stares():           #循环画圣诞树上的小星星
    t.hideturtle()      #隐藏画笔
    x1=-110   #x1赋初值
    x2=110    #x2赋初值
    y1=-40    #y1赋初值
    y2=-15    #y2赋初值
    n=0       #n用来控制在圣诞树两边画星星
    c = ['red', 'orange', 'yellow', 'brown', 'cyan', 'pink', 'blue', 'blueviolet','gold','white']    #星星的颜色,可自定义
    for i in c:   #循环画不同颜色的星星
        t.pencolor(i)     #每次从颜色列表c中按序取一个颜色
        t.up()      #找画星星的位置时要记得提起画笔
        if n%2==0:        #当n为偶数时在圣诞树左边画星星
            t.setx(r.randint(x1,0))
            t.sety(r.randint(y1,y2))
        else:             #当n为奇数时在圣诞树右边画星星
            t.setx(r.randint(0,x2))
            t.sety(r.randint(y1,y2))
        t.down()
        stars()     #开始画星星
        x1+=10      #每次画完记得按圣诞树的层数要将x1,x2减小,y1,y2上移
        x2-=10
        y1+=25
        y2+=25
        n+=1        #n=n+1
def tree(d,s):      #运用递归的方法画圣诞树
    t.hideturtle()              #隐藏画笔
    t.pencolor('limegreen')     #画笔颜色置为绿色,用来画树
    t.pensize(5)                #画笔大小为5
    t.speed(0)                  #最快速度画树(其实挺慢的)
    if d<=0:
        return
    t.forward(s)
    tree(d-1,s*0.8)
    t.right(120)
    tree(d-3,s*0.5)
    t.right(120)
    tree(d-3,s*0.5)
    t.right(120)
    t.backward(s)
def trees():          #画完整的圣诞树
    t.hideturtle()          #隐藏画笔
    t.left(90)              #将画笔向左旋转90度
    t.up()                  #提起画笔
    t.goto(0,-110)          #移动画笔到坐标(0,-110)处开始画树
    t.down()
    t.pencolor('saddlebrown')   #先画树根,将画笔置为棕色
    t.pensize(20)           #树根比较粗,画笔大小设置大一点
    t.forward(50)           #树根长度为50个像素
    t.up()                  #提笔
    t.goto(0,-50)           #将画笔移到(0,-50)处
    t.down()
    tree(15,60)             #调用画树的递归函数,慢慢画树
    t.goto(0,250)           #画完树后,将画笔移到(0,250)的位置,准备画大星星
    t.down()
    t.right(90)             #将画笔向右旋转90度,指向右方,准备画大星星
    star()                  #画大星星
def snow():            #画雪花(全屏)
    t.hideturtle()     #隐藏画笔
    t.pensize(2)       #画笔大小
    t.speed(0)         #画雪花的速度
    for i in range(500):          #循环画500个雪花
        t.pencolor('white')       #雪花是白色的
        t.penup()                 #提笔
        t.setx(r.randint(-1000,1000))     #在画布上随机找点
        t.sety(r.randint(-1000,1000))
        t.pendown()
        snowsize=r.randint(4,10)          #雪花大小
        for i in range(6):            #画雪花(雪花为六瓣,需要循环六次)
            t.forward(int(snowsize))
            t.backward(int(snowsize))
            t.left(60)
def gift():       #画正方体礼物盒
    t.hideturtle()       #隐藏画笔
    t.speed(0)           #画笔速度
    x=40    #礼物盒的长和宽,我设置为正方形礼物盒,长宽高相等
    y=16    #由于是立体图形,宽与长不一样
    for i in range(4):    #以下为画礼物盒的方法(x,y的值可以自行修改)
        t.forward(x)
        t.left(90)
    t.up()
    t.left(45)
    t.forward(y)
    t.right(45)
    t.down()
    for i in range(4):
        t.forward(x)
        t.left(90)
    t.up()
    t.right(135)
    t.forward(y)
    t.down()
    t.left(180)
    t.forward(y)
    t.backward(y)
    t.right(45)
    t.forward(x)
    t.left(45)
    t.forward(y)
    t.backward(y)
    t.left(45)
    t.forward(x)
    t.right(45)
    t.forward(y)
    t.backward(y)
    t.left(135)
    t.forward(x)
    t.right(135)
    t.forward(y)
    t.backward(y)
    t.right(135)
    t.forward(x)
    t.left(90)
def gifts():            #画多个正方体礼物盒
    t.hideturtle()      #隐藏画笔
    t.penup()           #提笔
    t.goto(-180,-150)    #将画笔移到(-180,-150)的位置准备画礼物盒
    t.pendown()
    t.pensize(5)         #画笔大小
    c=['red','orange','yellow','green','cyan','blue','blueviolet']    #礼物盒的颜色
    for i in c:          #循环画不同颜色的礼物盒
        t.up()
        t.forward(40)
        t.down()
        t.pencolor(i)
        gift()
def writes():       #写字:“圣诞快乐!”
    t.pencolor("cyan")      #画笔颜色,天蓝色
    t.hideturtle()          #隐藏画笔
    t.up()
    t.goto(-160,-250)       #从(-160,-250)开始写字
    t.down()
    t.write("Merry Christmas!",font=("Comic Sans MS",30,"bold"))   #开始写字,"Merry Christmas!"为要写的字,"Comic Sans MS"为字体,30为字的大小,bold为粗体(可自行修改要写的字)
def treet(d,s):      #运用递归的方法画圣诞树
    t.hideturtle()              #隐藏画笔
    t.pencolor('limegreen')     #画笔颜色置为绿色,用来画树
    t.pensize(5)                #画笔大小为5
    t.speed(0)                  #最快速度画树(其实挺慢的)
    if d<=0:
        return
    t.forward(s)
    treet(d-1,s*0.8)
    t.right(120)
    treet(d-3,s*0.5)
    t.right(120)
    treet(d-3,s*0.5)
    t.right(120)
    t.backward(s)
if __name__ == '__main__':      #主函数
    t.bgcolor('black')      #将画布置为黑色
    trees()         #画圣诞树
    stares()        #画树上的星星
    gifts()         #画礼物盒
    writes()        #写祝福语
    snow()          #下雪(画雪花)
    t.done()        #将画板停住(否则画完画会自动退出画画界面)  

相关文章:

  • JAVA EE,一文彻底聊明白
  • 知识图谱-KGE-语义匹配-双线性模型(打分函数用到了双线性函数)-2012:LFM(Latent Factor Model)
  • opcj-如何通过一个项目征服Java
  • 【知识图谱】(task1)知识图谱概论
  • PyTorch笔记 - Word Embeddings Word2vec 原理与源码
  • [C++]类和对象【上篇】
  • Docker 安装 Python
  • java 八股文
  • NETCAD GIS快速而简单的搜索引擎
  • Javascript异步编程深入浅出
  • 脉冲波形的产生和整形
  • 2022最后一个月,我们该如何学Java​?
  • Python用一行代码,截取图片
  • C# 11 中的新增功能
  • 【蓝桥杯国赛真题06】python绘制菱形圆环 蓝桥杯青少年组python编程 蓝桥杯国赛真题解析
  • 深入了解以太坊
  • 【mysql】环境安装、服务启动、密码设置
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • Facebook AccountKit 接入的坑点
  • HTML中设置input等文本框为不可操作
  • laravel with 查询列表限制条数
  • learning koa2.x
  • Linux CTF 逆向入门
  • Linux gpio口使用方法
  • PaddlePaddle-GitHub的正确打开姿势
  • STAR法则
  • Vue2 SSR 的优化之旅
  • webpack4 一点通
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 日剧·日综资源集合(建议收藏)
  • 三分钟教你同步 Visual Studio Code 设置
  • 什么是Javascript函数节流?
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 温故知新之javascript面向对象
  • 异常机制详解
  • gunicorn工作原理
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • raise 与 raise ... from 的区别
  • 扩展资源服务器解决oauth2 性能瓶颈
  • ​io --- 处理流的核心工具​
  • ​批处理文件中的errorlevel用法
  • #数学建模# 线性规划问题的Matlab求解
  • $forceUpdate()函数
  • $NOIp2018$劝退记
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (强烈推荐)移动端音视频从零到上手(下)
  • (一) storm的集群安装与配置
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)linux 命令大全
  • **CI中自动类加载的用法总结
  • .Net 6.0 处理跨域的方式