目录
引言
用代码编织爱意,变量是你,函数是我们。
一、turtle库函数基础命令介绍
turtle是python内置的图形化模块,可以用来绘制线条、圆、文本等。
1、设置窗口标题
窗口标题是程序运行后弹出窗口的名字,默认为Python Turtle Graphics
turtle.title("初见乍惊欢,久处亦怦然!")
2、设置画布大小
画布就是turtle用于绘图区域, 我们可以设置画布的大小为宽度900像素,高度500像素(输入宽和高为整数时, 表示像素;输入为小数时, 表示占据电脑屏幕的比例)
turtle.setup(900, 500)
3、设置画笔属性
画笔属性包括用于指定绘制的图形线条的宽度和颜色。我们可以设置画笔的宽度为2个像素和颜色为黑色(可以使用命名颜色或RGB值)
turtle.pensize(2)
turtle.color('black')
4、设置绘图命令
抬起画笔函数,是指在移动时不绘制图形,提起笔,即鼠标移动不会在画布上留下痕迹,用于另起一个地方绘制
turtle.penup()
位置函数,是指移动到指定的坐标 (x, y) 处(参数 x 是水平方向的像素坐标,y 是垂直方向的像素坐标),我们可以设置画笔移动到的位置在(0, 0)原点处
turtle.goto(0, 0)
放下画笔函数,是指在移动时绘制图形,放下笔,即鼠标移动会在画布上留下痕迹。
turtle.pendown()
画笔方向函数,是用于控制鼠标的方向,参数是角度值(参数为0时,即设置画笔的朝向水平向右;参数为90时,即设置画笔的朝向垂直向上;参数为180时,即设置画笔的朝向水平向左
turtle.setheading(0)
turtle.setheading(90)
turtle.setheading(180)
移动画笔函数,用于让画笔沿着当前画笔方向/相反方向/顺时针/逆时针直线移动一定的像素长度(我们可以是设置画笔先向当前画笔方向直线移动300个像素长度,然后画笔向相反方向移动600个像素长度。在 turtle 绘图中,方向默认是向右的,也就是初始时画笔的朝向是水平向右的)
turtle.fd(300)
turtle.bk(600)
绘制圆形函数(我们可以设置以goto函数移动的位置(0, 0)为圆心,绘制一个半径为60的圆,绘制的角度为360度,即绘制整个圆)
turtle.circle(60, 360)
画笔旋转移动函数(我们可以设置画笔顺时针移动120度后,再逆时针移动30度)
turtle.right(120)
turtle.left(30)
填充图形函数,是指利用turtle.begin_fill() 和turtle.end_fill() 两个函数将之间的区域填充上指定颜色(turtle.begin_fill() 准备开始填充图形,turtle.end_fill()填充完成)
turtle.begin_fill()
turtle.end_fill()
绘制文字的函数(我们可以设置文字的字体,大小和格式)
turtle.write(text, font=('宋体', 12, 'normal'))
延迟函数(暂停程序执行1秒钟)
time.sleep(1)
速度函数(控制画笔绘制的速度,画笔绘制的速度范围[0,10]整数, 数字越大越快)
turtle.speed(1)
隐藏鼠标显示函数(作图时不会看到鼠标移动画图)
hideturtle()
清除函数(清除turtle窗口,但是turtle的位置和状态不会改变)
turtle.clear()
二、表白实战
1、爱心表白
# 导入需要的模块,包括时间处理模块time和绘图模块turtle
import time
import turtle
from turtle import mainloop, hideturtle
# 定义清除画布的函数clear_all(),用于清除之前绘制的图形
def clear_all():
turtle.penup()
turtle.goto(0, 0)
turtle.color('white')
turtle.pensize(800)
turtle.pendown()
turtle.setheading(0)
turtle.fd(300)
turtle.bk(600)
# 定义重定位鼠标位置的函数go_to(x, y, state),通过传入坐标和状态来控制鼠标的位置和画笔状态
def go_to(x, y, state):
# 如果state为真,则放下画笔(pendown()),使得鼠标在移动时绘制图形;
# 如果state为假,则抬起画笔(penup()),使得鼠标在移动时不绘制图形,只是移动而不留下痕迹
turtle.pendown() if state else turtle.penup()
turtle.goto(x, y)
# 定义绘制心形的函数draw_heart(size),通过一系列turtle命令实现绘制
def draw_heart(size):
# 设置画笔颜色和填充颜色。它接受两个参数,第一个参数是画笔颜色,第二个参数是填充颜色
turtle.color('red', 'pink')
turtle.pensize(2)
turtle.pendown()
turtle.setheading(150)
# 调用 begin_fill() 和 end_fill() 之间的区域将被填充上指定颜色
turtle.begin_fill() # 用于开始记录心形的轮廓
turtle.fd(size)
# 用于绘制一个size*-3.745控制圆弧为半径,45角度为圆弧
# 负号 -3.745 使得圆弧呈现出向内凹的形状,从而形成心形的一部分
turtle.circle(size * -3.745, 45)
turtle.circle(size * -1.431, 165)
turtle.left(120)
turtle.circle(size * -1.431, 165)
turtle.circle(size * -3.745, 45)
turtle.fd(size)
turtle.end_fill() # 用于填充整个心形的区域
# 定义绘制发射爱心的小人的函数draw_people(x, y)
def draw_people(x, y):
turtle.penup() # 抬起画笔,避免绘制图形
turtle.goto(x, y) # 移动到指定的坐标 (x, y) 处
turtle.pendown() # 放下画笔,准备开始绘制
turtle.pensize(2) # 设置画笔的宽度为2个像素
turtle.color('black') # 设置画笔颜色为黑色
turtle.setheading(0) # 设置鼠标的朝向水平向右
# 绘制头部
turtle.circle(60, 360) # 画一个半径为60的圆,即头部
# 绘制两只眼睛
turtle.penup()
turtle.setheading(90) # 设置鼠标的朝向垂直向上
turtle.fd(75) # 向上移动75个单位长度
turtle.setheading(180) # 设置鼠标的朝向水平向左
turtle.fd(20) # 向左移动20个单位长度
turtle.pensize(4) # 设置画笔的宽度为4个像素
turtle.pendown() # 放下画笔,准备开始绘制
turtle.circle(2, 360) # 画一个半径为2的圆,即左眼
turtle.setheading(0) # 设置鼠标的朝向水平向右
turtle.penup()
turtle.fd(40) # 向右移动40个单位长度
turtle.pensize(4) # 设置画笔的宽度为4个像素
turtle.pendown() # 放下画笔,准备开始绘制
turtle.circle(-2, 360) # 画一个半径为2的圆,即右眼
# 绘制嘴巴
turtle.penup()
turtle.goto(x + 20, y + 20) # 调整嘴巴位置
turtle.setheading(90) # 设置鼠标的朝向垂直向上
turtle.fd(20) # 向上移动20个单位长度
turtle.pensize(4) # 设置画笔的宽度为4个像素
turtle.pendown()
turtle.circle(20, -180) # 画一个半径为2的圆,即左眼
# 绘制身体
turtle.penup()
turtle.goto(x, y) # 返回起始位置
turtle.setheading(-90) # 设置鼠标的朝向垂直向下
turtle.pendown() # 放下画笔,准备开始绘制
turtle.fd(20) # 向下移动20个单位长度
turtle.setheading(0) # 设置鼠标的朝向水平向右
turtle.fd(35) # 向右移动35个单位长度
turtle.setheading(60) # 设置鼠标的朝向逆时针旋转60度
turtle.fd(10) # 沿着当前方向前进10个单位长度
turtle.penup()
turtle.goto(x, y) # 返回起始位置
turtle.setheading(-90) # 设置鼠标的朝向垂直向下
turtle.pendown() # 放下画笔,准备开始绘制
turtle.fd(40) # 向下移动40个单位长度
turtle.setheading(0) # 设置鼠标的朝向水平向右
turtle.fd(35) # 向右移动35个单位长度
turtle.setheading(-60) # 设置鼠标的朝向逆时针旋转60度
turtle.fd(10) # 沿着当前方向前进10个单位长度
turtle.penup()
turtle.goto(x, y) # 返回起始位置
turtle.setheading(-90) # 设置鼠标的朝向垂直向下
turtle.pendown() # 放下画笔,准备开始绘制
turtle.fd(60) # 向下移动60个单位长度
turtle.setheading(-135) # 设置鼠标的朝向逆时针旋转135度
turtle.fd(60) # 沿着当前方向前进60个单位长度
turtle.bk(60) # 沿着当前方向后退60个单位长度
turtle.setheading(-45) # 设置鼠标的朝向逆时针旋转45度
turtle.fd(30) # 沿着当前方向前进30个单位长度
turtle.setheading(-135) # 设置鼠标的朝向逆时针旋转135度
turtle.fd(35) # 沿着当前方向前进35个单位长度
turtle.penup() # 抬起画笔,绘制完成
# 定义绘制文字的函数draw_text(text, t_color, font_size, show_time),通过turtle库绘制指定颜色、字体大小的文字,并在指定时间后清除
def draw_text(text, t_color, font_size, show_time):
turtle.penup() # 抬起画笔,准备移动而不绘制
turtle.goto(-350, 0) # 将画笔移动到指定位置
turtle.color(t_color) # 设置画笔颜色
turtle.write(text, font=('宋体', font_size, 'normal'))
time.sleep(show_time) # 暂停程序执行show_time秒钟
clear_all() # 清除画布
# 定义绘制爱心发射场景的函数draw_(),通过一系列turtle命令实现
def draw_process():
# turtle.speed(10), 其中0表示“最快”,1表示“慢速”,10表示“最慢”
turtle.speed(10) # 设置画笔速度为最快
draw_people(-250, 20) # 绘制小人形状
turtle.penup() # 抬起画笔,准备移动而不绘制
turtle.goto(-150, -30) # 将画笔移动到指定位置
draw_heart(14) # 绘制大小为14的心形
turtle.penup() # 抬起画笔,准备移动而不绘制
turtle.goto(-200, -200) # 将画笔移动到指定位置
turtle.color('pink') # 设置画笔颜色为粉红色
turtle.write('Biu~', font=('宋体', 60, 'normal')) # 在当前位置写入文本 'Biu~'
turtle.penup() # 抬起画笔,准备移动而不绘制
turtle.goto(-20, -60) # 将画笔移动到指定位置
draw_heart(25) # 绘制大小为25的心形
turtle.penup() # 抬起画笔,准备移动而不绘制
turtle.goto(-25, -200) # 将画笔移动到指定位置
turtle.color('pink') # 设置画笔颜色为粉红色
turtle.write('Biu~', font=('宋体', 60, 'normal')) # 在当前位置写入文本 'Biu~'
turtle.penup() # 抬起画笔,准备移动而不绘制
turtle.goto(200, -100) # 将画笔移动到指定位置
draw_heart(45) # 绘制大小为45的心形
turtle.penup() # 抬起画笔,准备移动而不绘制
turtle.goto(150, -200) # 将画笔移动到指定位置
turtle.color('pink') # 设置画笔颜色为粉红色
turtle.write('Biu~', font=('宋体', 60, 'normal')) # 在当前位置写入文本 'Biu~'
turtle.hideturtle() # 隐藏画笔图形
time.sleep(3) # 暂停程序执行3秒钟
# 定义主函数main(),设置窗口标题、大小,依次调用draw_text()draw_process()函数绘制文字和场景
def main():
# 隐藏鼠标
hideturtle()
# 设置窗口的标题
turtle.title("初见乍惊欢,久处亦怦然!")
# 设置了画布的大小为宽度900像素,高度500像素
turtle.setup(900, 500)
draw_text("Are You Ready?", "black", 60, 1)
draw_text("接下来,我想对你说:", "deepskyblue", 45, 2)
draw_text("感谢你的出现,让我的日子这么甜!", "hotpink", 35, 3)
draw_process()
# 调用mainloop()以防止窗口卡死
mainloop()
# 在模块被直接运行时,调用主函数
if __name__ == '__main__':
main()
展示如下:
2、爱之花舞
import turtle
def red_heart(x, y, liftx):
turtle.pensize(3) # 设置画笔宽度为3个像素
turtle.speed(10) # 设置画笔移动速度为10
turtle.color("red", "red") # 设置画笔颜色为红色,填充颜色也为红色
turtle.up() # 抬起画笔,不绘制图形
turtle.goto(x, y) # 将画笔移动到指定坐标 (x, y)
turtle.down() # 放下画笔,准备开始绘制
turtle.begin_fill() # 开始填充形状
turtle.left(liftx) # 逆时针旋转画笔一定角度
turtle.fd(80) # 向当前方向前进80个单位长度
turtle.circle(-40, 180) # 以当前位置为圆心画指定半径和角度的弧
turtle.left(90) # 逆时针旋转画笔90度
turtle.circle(-40, 180) # 以当前位置为圆心画指定半径和角度的弧
turtle.left(0) # 逆时针旋转画笔0度
turtle.fd(80) # 向当前方向前进80个单位长度
turtle.end_fill() # 结束填充形状
def rose():
turtle.speed(10) # 设置画笔移动速度为10
turtle.penup() # 抬起画笔,不绘制图形
turtle.left(90) # 逆时针旋转画笔90度
turtle.fd(200) # 向当前方向前进200个单位长度
turtle.pendown() # 放下画笔,准备开始绘制
turtle.right(90) # 顺时针旋转画笔90度
turtle.pensize(2) # 设置画笔宽度为2个像素
# 以下为绘制花朵的具体步骤,包括花蕊、花瓣、叶子等
turtle.fillcolor("red") # 设置填充颜色为红色
turtle.begin_fill() # 开始填充
turtle.circle(10, 180) # 画一个半径为10的半圆
turtle.circle(25, 110) # 画一个半径为25的半圆
turtle.left(50) # 左转50度
turtle.circle(60, 45) # 画一个半径为60的45度圆弧
turtle.circle(20, 170) # 画一个半径为20的170度圆弧
turtle.right(24) # 右转24度
turtle.fd(30) # 向前移动30个单位长度
turtle.left(10) # 左转10度
turtle.circle(30, 110) # 画一个半径为30的110度圆弧
turtle.fd(20) # 向前移动20个单位长度
turtle.left(40) # 左转40度
turtle.circle(90, 70) # 画一个半径为90的70度圆弧
turtle.circle(30, 150) # 画一个半径为30的150度圆弧
turtle.right(30) # 右转30度
turtle.fd(15) # 向前移动15个单位长度
turtle.circle(80, 90) # 画一个半径为80的90度圆弧
turtle.left(15) # 左转15度
turtle.fd(45) # 向前移动45个单位长度
turtle.right(165) # 右转165度
turtle.fd(20) # 向前移动20个单位长度
turtle.left(155) # 左转155度
turtle.circle(150, 80) # 画一个半径为150的80度圆弧
turtle.left(50) # 左转50度
turtle.circle(150, 90) # 画一个半径为150的90度圆弧
turtle.end_fill() # 结束填充
# 右侧花瓣
turtle.left(150) # 左转150度
turtle.circle(-90, 70) # 画一个半径为-90的70度圆弧(实际为反向弧)
turtle.left(20) # 左转20度
turtle.circle(75, 105) # 画一个半径为75的105度圆弧
turtle.setheading(60) # 设置朝向为60度
turtle.circle(80, 98) # 画一个半径为80的98度圆弧
turtle.circle(-90, 40) # 画一个半径为-90的40度圆弧(实际为反向弧)
# 左侧花瓣
turtle.left(180) # 左转180度
turtle.circle(90, 40) # 画一个半径为90的40度圆弧
turtle.circle(-80, 98) # 画一个半径为-80的98度圆弧(实际为反向弧)
turtle.setheading(-83) # 设置朝向为-83度
# 左侧叶子
turtle.fd(30) # 向前移动30个单位长度
turtle.left(90) # 左转90度
turtle.fd(25) # 向前移动25个单位长度
turtle.left(45) # 左转45度
turtle.fillcolor("green") # 设置填充颜色为绿色
turtle.begin_fill() # 开始填充
turtle.circle(-80, 90) # 画一个半径为-80的90度圆弧
turtle.right(90) # 右转90度
turtle.circle(-80, 90) # 画一个半径为-80的90度圆弧
turtle.end_fill() # 结束填充
turtle.right(135) # 右转135度
turtle.fd(60) # 向前移动60个单位长度
turtle.left(180) # 左转180度
turtle.fd(85) # 向前移动85个单位长度
turtle.left(90) # 左转90度
turtle.fd(80) # 向前移动80个单位长度
# 右侧叶子
turtle.right(90) # 右转90度
turtle.right(45) # 右转45度
turtle.fillcolor("green") # 设置填充颜色为绿色
turtle.begin_fill() # 开始填充
turtle.circle(80, 90) # 画一个半径为80的90度圆弧
turtle.left(90) # 左转90度
turtle.circle(80, 90) # 画一个半径为80的90度圆弧
turtle.end_fill() # 结束填充
turtle.left(135) # 左转135度
turtle.fd(60) # 向前移动60个单位长度
turtle.left(180) # 左转180度
turtle.fd(60) # 向前移动60个单位长度
turtle.right(90) # 右转90度
turtle.circle(200, 50) # 画一个圆 200 是半径,50 是弧度
red_heart(-230, 80, 180) # 调用 red_heart 函数,传递参数 x=-230, y=80, angle=180,绘制一个红色的心形图案
red_heart(-230, -80, -30) # 调用 red_heart 函数,传递参数 x=-230, y=-80, angle=-30,绘制一个红色的心形图案
red_heart(-130, -180, -30) # 调用 red_heart 函数,传递参数 x=-130, y=-180, angle=-30,绘制一个红色的心形图案
red_heart(210, 80, 120) # 调用 red_heart 函数,传递参数 x=210, y=80, angle=120,绘制一个红色的心形图案
red_heart(170, -110, 180) # 调用 red_heart 函数,传递参数 x=170, y=-110, angle=180,绘制一个红色的心形图案
# 绘制玫瑰花并添加文字
printer = turtle.Turtle() # 创建一个新的画笔对象
printer.hideturtle() # 隐藏画笔图标
printer.penup() # 抬起画笔,不绘制图形
printer.back(200) # 向后移动200个单位长度
printer.write("赠给亲爱的 女士\n\n", align="right", font=("楷体", 16, "bold"))
printer.write("from 先生", align="center", font=("楷体", 12, "normal"))
turtle.done() # 完成绘制
if __name__ == "__main__":
turtle.title("是微风,是晚霞,是心跳,是无可替代") # 设置窗口标题
rose() # 调用rose函数进行绘制
展示如下:
3、浪漫爱意
import time # 导入时间模块
import turtle # 导入 turtle 模块
def go_to(x, y):
turtle.up() # 抬起画笔,不绘制图形
turtle.goto(x, y) # 将画笔移动到指定坐标 (x, y)
turtle.down() # 放下画笔,准备绘制图形
def small_Circle(size): # 函数用于绘制心的小圆
turtle.speed(10) # 设置绘制速度为10,控制海龟绘图速度
for i in range(210):
turtle.forward(size) # 向当前方向前进指定长度
turtle.right(0.786) # 向右旋转指定角度
def big_Circle(size): # 函数用于绘制心的大圆
turtle.speed(10) # 设置绘制速度为10
for i in range(150):
turtle.forward(size) # 向当前方向前进指定长度
turtle.right(0.3) # 向右旋转指定角度
def line(size):
turtle.speed(10) # 设置绘制速度为10
turtle.forward(51 * size) # 向当前方向前进指定长度
def heart(x, y, size):
go_to(x, y) # 调用 go_to 函数将画笔移动到指定坐标
turtle.left(150) # 将海龟左转150度
turtle.begin_fill() # 开始填充图形
line(size) # 调用 line 函数绘制线段
big_Circle(size) # 调用 big_Circle 函数绘制大圆
small_Circle(size) # 调用 small_Circle 函数绘制小圆
turtle.left(120) # 将海龟左转120度
small_Circle(size) # 再次调用 small_Circle 函数绘制小圆
big_Circle(size) # 再次调用 big_Circle 函数绘制大圆
line(size) # 再次调用 line 函数绘制线段
turtle.end_fill() # 结束填充图形
def main():
turtle.pensize(2) # 设置画笔的宽度为2个像素
turtle.color('red', 'pink') # 设置画笔颜色和填充颜色
turtle.getscreen().tracer(1, 0) # 设置 turtle 模块的追踪速度,用于控制绘图显示的速度
heart(100, 0, 0.7) # 调用 heart 函数绘制心形图案
time.sleep(0.3) # 暂停程序执行0.3秒
go_to(80, 70) # 调用 go_to 函数将画笔移动到指定坐标
turtle.write("官人", font=("楷体", 18, "normal")) # 在画布上写文字
turtle.setheading(0) # 设置海龟的朝向为水平向右
heart(-80, -100, 1) # 再次调用 heart 函数绘制心形图案
time.sleep(0.3) # 暂停程序执行0.3秒
go_to(-110, 15) # 调用 go_to 函数将画笔移动到指定坐标
turtle.write("娘子", font=("宋体", 20, "normal")) # 在画布上写文字
time.sleep(0.7) # 暂停程序执行0.7秒
go_to(40, -80) # 调用 go_to 函数将画笔移动到指定坐标
turtle.write("春风十里,不如你,三生三世皆是你!", move=True, align="left", font=("arial", 12, "italic")) # 在画布上写文字
turtle.done() # 结束 turtle 图形界面
if __name__ == "__main__":
turtle.title("那就在一起,晨昏与四季") # 设置窗口标题
main() # 调用 main 函数进行绘制
展示如下:
总结
用代码创造甜蜜瞬间,变量中藏着我对你的表白!