文章图片
“我喜欢turtle绘图,因为代码一点点的改动,总会带来意想不到的惊喜。
一些让我心动过的案例,分享给大家,也珍藏给自己。”
—— 初中信息技术教师许华丽
2022年2月4日,北京冬奥会开幕式,24节气和倒计时结合,再配上古诗词,彰显了中华五千年文化底蕴之深厚。古往今来,如诗如画!
受此启发,我用Python中的turtle模块简单地做了一个24秒倒计时。效果如下,但愿大家喜欢。
文章图片
难度:★★★☆☆☆
本文将分五步来实现倒计时功能,从5行代码逐步扩展到80行代码。
步骤1:ontimer()函数的应用
【效果预览】
文章图片
【重难点突破】
ontimer()函数
语法:turtle.ontimer(fun, t=0)
作用:安装一个计时器,在 t 毫秒后调用 fun 函数。(1秒=1000毫秒)
参数:
fun一个无参数的函数
t一个数值 >= 0
【代码参考】
# 案例1:程序点运行后,2000毫秒后海龟再开始画图
import turtle# 导入turtle库(模块)
def fun():# 自定义函数fun()
turtle.forward(100)# 海龟向前移动100像素(步)
turtle.left(90)# 海龟向左旋转90度turtle.ontimer(fun,2000)# 调用自定义函数fun()
步骤2:制作5秒数字倒计时
【效果预览】
文章图片
【重难点突破】
下图就是已经写好的制作5秒倒计时的代码,但是运行时有错误提示。到底是哪里出错了?
文章图片
错误提示:UnboundLocalError:local variable 'n' referenced before assignment
解析:在自定义函数外部已经定义了变量n(属于全局变量),但是在自定义函数内部对该变量进行赋值运算后,却遇到了这样的错误。
这是因为,在自定义函数内部对变量赋值进行修改后,该变量就会被Python认为是新创建的局部变量,而非全局变量。
当程序执行到n=n+1的时候,因为这条语句是给n赋值,所以n变成了局部变量,那么在执行turtle.write(number[n],align="center",font=("黑体",120))的时候,因为n这个局部变量还没有定义,自然就会抛出这样的错误。
解决方法:使用关键字golbal,将变量n强制为全局变量,这样在自定义函数内部修改全局变量n,Python就不会重新创建一个局部变量,而是修改了主程序中定义的全局变量。修改后的代码如下:
文章图片
【代码参考 · 优化前】
为了便于直观理解,倒计时要显示的5个数字,在下面的代码中单独创建了列表["5","4","3","2","1"]。
# 案例2.1:应用ontimer()函数,制作5秒倒计时
# 倒计时数字单独创建列表number存放import turtle
n=0# 定义变量n,作为累加器
number=["5","4","3","2","1"]# 创建列表number,存储5个数字# 自定义函数fun()
def fun():# 自定义函数fun()
global n# 强制n是全局变量的n。(即声明自定义函数内部的变量n,为外部的那个全局变量n)
turtle.clear()# 清除屏幕中的已有绘图。(如果不用clear(),5个数字会重叠在一起)
turtle.write(number[n],align="center",font=("黑体",120))# 海龟写数字,居中显示
n=n+1# 给全局变量n重新赋值。即对累加器n 进行加1操作# 主程序
for i in range(5):# 每次调用fun()函数写一个数字,循环5次则会写5个数字
# 调用自定义函数fun()
turtle.ontimer(fun, t=1000*(i+1))# 安装一个计时器,t毫秒后调用fun()函数
【代码参考· 优化后】
事实上,倒计时数字不需要再单独创建列表["5","4","3","2","1"],可以直接用变量n来表示。变量n是从0递增至4,倒计时的5个数字就可以用5-n来表示。
# 案例2.2:应用ontimer()函数,制作5秒倒计时
# 倒计时数字不需要单独创建列表number,直接用变量n来表示
# 变量n是从0递增至4,倒计时数字就应该用5-n来表示import turtle# 导入turtle库(模块)
n=0# 定义变量n,作为累加器### 自定义函数fun()
# fun()的功能是,写一个倒计时数字
def fun():# 自定义函数fun()
global n# 强制n是全局变量的n。(即声明自定义函数内部的变量n,为外部的那个全局变量n)
turtle.clear()# 清除屏幕中的已有绘图。(如果不用clear(),5个数字会重叠在一起)
turtle.write(5-n,align="center",font=("黑体",120))# 海龟写数字,居中显示
n=n+1# 给全局变量n重新赋值。即对累加器n 进行加1操作### 主程序
for i in range(5):# 每次调用fun()写一个数字,循环5次则会写5个数字
# 调用自定义函数fun()
turtle.ontimer(fun, t=1000*(i+1))# 安装一个计时器,t毫秒后调用fun()函数
步骤3:制作5个节气的倒计时
【效果预览】
文章图片
【重难点突破】
turtle.penup()有时也可以单独使用
海龟抬脚,移动时不会留下痕迹,但是仍然可以写字,所以如果只是移动到合适的位置让海龟写字,就无需再写pendown()。
【代码参考】
# 案例3:应用ontimer()函数,制作5个节气倒计时
import turtle# 导入turtle库(模块)### ①变量初始化设置
# 创建列表name,存放中文名称
name=["大雪","冬至","小寒","大寒","立春"]
# 创建列表en_name,存放英文名称
en_name=["Major Snow","Winter Solstice","Minor Cold","Major Cold","Beginning of Spring"]
# 定义变量n,作为累加器
n=0### ②自定义函数fun()
# fun()的功能是,写一个倒计时数字,以及一个节气的名称和英文名称
def fun():# fun()为无参函数
global n# 强制n是全局变量的n。(即声明自定义函数内部的变量n,为外部的那个全局变量n)
turtle.clear()# 清除屏幕中的已有绘图。(如果不用clear(),5个数字会重叠在一起)
turtle.penup()# 海龟抬脚,移动时不会留下痕迹,但是仍然可以写字,所以后面无需再写pendown()turtle.write(5-n,align="center",font=("黑体",120))# 写数字,居中显示
turtle.setheading(-90)# 让海龟头部向下
turtle.forward(50)# 海龟向下移动80像素,准备写字
turtle.write(name[n],align="center",font=("黑体",30))# 写节气中文名称
turtle.forward(50)# 海龟再向下移动80像素,准备写字
turtle.write(en_name[n],align="center",font=("Arial",25))# 写节气英文名称turtle.home()# 海龟返回原点
n=n+1# 累加器n加1### ③主程序
for i in range(5):# 每次调用fun()写一个数字,循环5次则会写5个数字
# 调用自定义函数fun()
turtle.ontimer(fun, t=1000*(i+1))# 安装一个计时器,t毫秒后调用fun()函数### 海龟绘图结束,隐藏海龟
turtle.hideturtle()
步骤4:美化5个节气倒计时
【效果预览】
文章图片
【代码参考】
# 案例4:美化5个节气倒计时### ①程序初始化设置
import turtle# 导入turtle库(模块)
turtle.bgcolor("#ffff55")# 设置背景颜色为#ffff55,一种浅黄色
turtle.speed(0)# 设置海龟的绘图速度,参数为0时最快
turtle.delay(0)# 设置海龟绘图的延迟时间,参数为0时,表示绘图没有延迟### ②变量初始化设置
# 创建列表name,存放中文名称
name=["大雪","冬至","小寒","大寒","立春"]
# 创建列表en_name,存放英文名称
en_name=["Major Snow","Winter Solstice","Minor Cold","Major Cold","Beginning of Spring"]
# 定义变量n,作为累加器
n=0### ③自定义函数fun()
# fun()的功能是,写一个倒计时数字,以及一个节气的名称和英文名称
def fun():# fun()为无参函数
global n# 强制n是全局变量的n(即声明本函数体内的变量n为主函数中的那个全局变量n)
turtle.clear()# 清除屏幕中的已有绘图。如果不用clear(),5个数字会重叠在一起
turtle.dot(500,"#b1352b") # 画一个直径为500,颜色为#b1352b(一种红色)的圆点,作为背景装饰。
turtle.penup()# 海龟抬脚,移动时不会留下痕迹,但是仍然可以写字,所以后面无需再写pendown()turtle.write(5-n,align="center",font=("黑体",120))# 写数字
turtle.setheading(-90)# 让海龟头部向下
turtle.forward(50)# 海龟向下移动80像素,准备写字
turtle.write(name[n],align="center",font=("黑体",30))# 写节气中文名称
turtle.forward(50)# 海龟再向下移动80像素,准备写字
turtle.write(en_name[n],align="center",font=("Arial",25))# 写节气英文名称turtle.home()# 海龟返回原点
n=n+1# 累加器n加1### ④主程序
# 显示两行引导文字
turtle.pencolor("black")# 设置画笔颜色为黑色
turtle.penup()# 海龟抬脚,移动时不会留下痕迹,但是仍然可以写字,所以后面无需再写pendown()
turtle.setheading(-90)# 让海龟头部向下
turtle.backward(30)# 海龟向上移动30像素(步),准备写字.(如果不向上移动30像素,海龟写出的两行字会偏下)
turtle.write("让我们一起倒计时,迎接春的到来",align="center",font=("黑体",20))# 写中文引导语
turtle.forward(60)# 海龟再向下移动60像素(步),准备写字
turtle.write("Let's greet the arrival of spring with a countdown",align="center",font=("Arial",20))# 写英文引导语
turtle.home()# 海龟返回原点,回到初始位置# 24秒倒计时开始
turtle.pencolor("white")# 设置画笔颜色为白色
for i in range(5):# 每次调用fun()写一个数字,循环5次则会写5个数字
# 调用自定义函数fun()
turtle.ontimer(fun, t=1000*(i+1))# 安装一个计时器,t毫秒后调用fun()函数### ⑤海龟绘图结束,隐藏海龟
turtle.hideturtle()
步骤5:扩展到24节气倒计时
【效果预览】
文章图片
【代码参考】
# 案例5:24节气倒计时(代码参考1)### ① 程序初始化设置
import turtle# 导入turtle库(模块)
turtle.bgcolor("#ffff55")# 设置背景颜色为#ffff55,一种浅黄色
turtle.speed(0)# 设置海龟的绘图速度,参数为0时最快
turtle.delay(0)# 设置海龟绘图的延迟时间,参数为0时,表示绘图没有延迟### ② 变量初始化设置
# 创建列表name,存放24节气中文名称
name=["雨水","惊蛰","春风",
"清明","谷雨","立夏",
"小满","芒种","夏至",
"小暑","大暑","立秋",
"处暑","白露","秋风",
"寒露","霜降","立冬",
"小雪","大雪","冬至",
"小寒","大寒","立春"]# 创建列表en_name,存放24节气英文名称
en_name=["Rain Water","Awakening of Insects","Spring Equinox",
"Pure Brightness","Grain Rain","Beginning of Summer",
"Grain Buds","Grain in Ear","Summer Solstice",
"Minor Heat","Major Heat","Beginning of Autumn",
"End of Heat","White Dew","Autumn Equinox",
"Cold Dew","Frost's Descent","Beginning of Winter",
"Minor Snow","Major Snow","Winter Solstice",
"Minor Cold","Major Cold","Beginning of Spring"]# 创建列表poem,存放诗词
# 没有对应的诗词,就定义为空字符串。如果不定义,调用时会报错
poem=["随风潜入夜 润物细无声","春雷响 万物长","春风如贵客 一到便繁华",
"清明时节雨纷纷","风吹雨洗一城花","天地始交 万物并秀",
"物至于此 小得盈满","家家麦饭美 处处菱歌长","绿筠尚含粉 圆荷始散芳",
"荷风送香气 竹露滴清响","桂轮开子夜 萤火照空时","天阶夜色凉如水 坐看牵牛织女星",
"春种一粒粟 秋收万颗子","露从今夜白 月是故乡明","",
"","","",
"","","",
"","",""]# 定义变量n,作为累加器
n=0### ③ 自定义函数fun()
# fun()的功能是,写一个倒计时数字,以及一个节气的名称、英文名称和对应的诗词
def fun():
global n# 强制n是全局变量的n(即声明本函数体内的变量n为主函数中的那个全局变量n)
turtle.clear()# 清除屏幕中的已有绘图。(如果不用clear(),5个数字会重叠在一起)
turtle.dot(500,"#b1352b")# 画一个直径为500,颜色为#b1352b(一种红色)的圆点,作为背景装饰
turtle.penup()# 海龟抬脚,移动时不会留下痕迹,但是仍然可以写字,所以后面无需再写pendown()
turtle.setheading(-90)# 让海龟头部向下turtle.backward(10)# 海龟向上移动10像素,准备写字.(如果不向上移动10像素,海龟写出的几行字会偏下)
turtle.write(24-n,align="center",font=("黑体",120))# 写倒计时数字(第1行)
turtle.forward(50)# 海龟向下移动50像素,准备写字
turtle.write(name[n],align="center",font=("黑体",30))# 写节气中文名称(第2行)
turtle.forward(50)# 海龟再向下移动50像素,准备写字
turtle.write(en_name[n],align="center",font=("Arial",25)) # 写节气英文名称(第3行)
turtle.forward(50)# 海龟再向下移动50像素,准备写字
turtle.write(poem[n],align="center",font=("隶书",20))# 写节气对于诗词(第4行)turtle.home()# 海龟返回原点,回到初始位置
n=n+1# 累加器n加1### ④ 主程序
# 显示两行引导文字
turtle.pencolor("black")# 设置画笔颜色为黑色black
turtle.penup()# 海龟抬脚,移动时不会留下痕迹,但是仍然可以写字,所以后面无需再写pendown()
turtle.setheading(-90)# 让海龟头部向下
turtle.backward(30)# 海龟向上移动30像素(步),准备写字.(如果不向上移动30像素,海龟写出的两行字会偏下)
turtle.write("让我们一起倒计时,迎接春的到来",align="center",font=("黑体",20))# 写中文引导语
turtle.forward(60)# 海龟再向下移动60像素(步),准备写字
turtle.write("Let's greet the arrival of spring with a countdown",align="center",font=("Arial",20))# 写英文引导语
turtle.home()# 海龟返回原点,回到初始位置# 24秒倒计时开始
turtle.pencolor("white")# 设置画笔颜色为白色white
for i in range(24):# 每次调用fun()写4行文字,要循环24次
# 调用自定义函数fun()
turtle.ontimer(fun, t=1000*(i+1))# 安装一个计时器,t毫秒后调用fun()函数### ⑤ 海龟绘图结束,隐藏海龟
turtle.hideturtle()
---end---
【Python|Python Turtle绘图[难度3星](24节气倒计时(1.使用列表存储数据))】
推荐阅读
- Python|Python Turtle绘图[难度3星](24节气倒计时(2.使用字典存储数据))
- css|如何在Chrome浏览器中运行Selenium()
- java|safari chrome_Mac用户应放弃Safari的Google Chrome浏览器
- python|论文画图神器!25个常用Matplotlib图的Python代码,收藏收藏!
- python|在pandas / python中的数据框中合并两列文本
- #|基于蒙特卡洛法的规模化电动汽车充电负荷预测(Python&Matlab实现)
- #|一场樱花雨(Python实现)
- Python数据分析|Seaborn可视化绘制散点图
- 算法|机器学习必学十大算法