练习:七段数码管的实现。知识点:turtle库的使用
实现思路:
-
单个数字数码管的绘制实现
-
多个数字数码管的绘制实现
-
根据当前系统时间绘制数码管
那七段数码管的样子是什么样呢,咱来看图1分析下
图1:
这个图就是七段数码管(话说,我只看过电路图里有这玩意儿,坚定了我要学python的信念,啥都能玩儿啊)
经过画图论证,发现以下笔画线路(图2),画笔可以一笔到位(也就是笔画线路不重复)。当然了,这个笔画线路是从左往右实现的(要是你想从右往左也是可以的,不过咱写字习惯从左往右)。
图2:
知识点:
数码管的绘制需要引用[turtle]库,那么,turtle库是干啥的呢?
据我们讲师的解释是【入门级的图形函数绘制库】,直白的说,就是使用该类库进行程序绘图。
我的理解吧,turtle库就相当于咱们养了一只小海龟,闲着无聊了,指挥它在沙滩上作画(莫名有点装13的感觉,我只是个入门级的小白,请各位大佬不仅手下留情,更要嘴下留情啊)。
turtle常用的知识点有啥(目前我还不清楚哪些是函数,哪些是属性,后期修改)
代码实现,咱们以数字3来示例:
-
单个数字数码管的绘制
导入turtle库
import turtle
创建一个‘海龟’画笔对象,定义画笔的属性,先定义画笔的样式和绘制速度
t = turtle.Pen() t.shape("turtle") # 画笔样式,默认是箭头→,这里设置成小海龟,个人喜好 t.speed(3) # 画笔绘制速度,0-9,0:速度最慢,依次递增,9的速度最快
根据图2来看,3要实现的笔画有1,2,3,6,7。定义一个画数字的方法
# 是否落笔,画出内容 def drawLine(flag): if flag: t.down() # 落笔 else: t.up() # 抬笔 t.fd(40) # 画40px的线条 t.right(90) # 下一笔,画笔方向沿水平方向顺时针旋转90°再继续画。顺时针旋转角度使用right() # 绘制数字 def drawDight(num): # 笔画1 存在的数字 drawLine(True) if num in [2, 3, 4, 5, 6, 8, 9] else drawLine(False) # 笔画2 存在的数字 drawLine(True) if num in [0, 1, 3, 4, 5, 6, 7, 8, 9] else drawLine(False) # 笔画3 存在的数字 drawLine(True) if num in [0, 1, 3, 4, 5, 6, 7, 8, 9] else drawLine(False) # 笔画4 存在的数字 drawLine(True) if num in [0, 2, 6, 8] else drawLine(False) # 笔画4结束后,可以发现画笔的方向指向水平方向右侧,但是笔画5的方向是水平向上 # 这时画笔需要沿水平方向逆时针旋转90°,逆时针旋转,使用left() t.left(90) # 笔画5 存在的数字 drawLine(True) if num in [4, 5, 6, 8, 9, 0] else drawLine(False) # 笔画6 存在的数字 drawLine(True) if num in [2, 3, 5, 6, 7, 8, 9, 0] else drawLine(False) # 笔画7 存在的数字 drawLine(True) if num in [1, 2, 3, 4, 7, 8, 9, 0] else drawLine(False)
调用绘制的方法,实现3的数码管
# 我写了一个主函数,来设置画布的大小、画笔颜色以及画笔的大小 def main(): turtle.setup(500, 400) # 可以理解画布的大小 t.pencolor('red') # 画笔的颜色 t.pensize(5) # 画笔的大小 drawDight(3) main() turtle.done() # 内容绘制完毕后,不关闭窗口
实现后的效果如图(我还没学会怎么制作动态图,待我学会,将动态效果上传上来,暂时就委屈下各位看客了)
-
多个数字的绘制代码
在单个数字的绘制代码中,修改了绘制数字和主函数的代码,这里就只贴出改动的代码
# 绘制数字 def drawDight(num): # 笔画1 存在的数字 drawLine(True) if num in [2, 3, 4, 5, 6, 8, 9] else drawLine(False) # 笔画2 存在的数字 drawLine(True) if num in [0, 1, 3, 4, 5, 6, 7, 8, 9] else drawLine(False) # 笔画3 存在的数字 drawLine(True) if num in [2, 3, 5, 6, 8, 9, 0] else drawLine(False) # 笔画4 存在的数字 drawLine(True) if num in [0, 2, 6, 8] else drawLine(False) # 笔画4结束后,可以发现画笔的方向指向水平方向右侧,但是笔画5的方向是水平向上 # 这时画笔需要沿水平方向逆时针旋转90°,逆时针旋转,使用left() t.left(90) # 笔画5 存在的数字 drawLine(True) if num in [4, 5, 6, 8, 9, 0] else drawLine(False) # 笔画6 存在的数字 drawLine(True) if num in [2, 3, 5, 6, 7, 8, 9, 0] else drawLine(False) # 笔画7 存在的数字 drawLine(True) if num in [1, 2, 3, 4, 7, 8, 9, 0] else drawLine(False) # 当一个数字画完后,将画笔方向调整为水平向右,并虚画20px,为其他数字的绘制做准备 t.up() # 抬笔,虚画 t.left(180) # 将画笔方向沿水平方向逆时针调整180°,使画笔方向水平向右 t.fd(20) # 将画笔沿水平方向向前行进20px,为其他数字做准备 # 我写了一个主函数,来设置画布的大小、画笔落笔位置、画笔颜色以及画笔的大小 def main(): turtle.setup(1000, 800) # 可以理解画布的大小 t.up() t.backward(400) # 画笔落笔位置 t.pencolor('red') # 画笔的颜色 t.pensize(5) # 画笔的大小 t.down() data = "20191030" for i in data: drawDight(eval(i))
实现效果(没有截全屏,空白内容太多了):
-
根据当前系统时间绘制数码管
从多个数字的绘制效果来看,基本上已经实现了数码管的绘制,但图1中的数字之间是有截断的,并且我想要根据系统时间自动获取时间,完善后的完整代码示例:
#!/usr/bin/env python # -*- coding: utf-8 -*- # author:albert time:2019/10/29 # import turtle import time t = turtle.Pen() t.shape("turtle") # 画笔样式,默认是箭头→,这里设置成小海龟,个人喜好 t.speed(9) # 画笔绘制速度,0-9,0:速度最慢,依次递增,9的速度最快 def drawGap(): t.up() t.fd(5) # 调整文字位置,使文字居中 def txt_center(): t.left(180) t.fd(40) t.right(90) t.up() t.fd(80) t.down() def drawLine(flag): drawGap() if flag: t.down() else: t.up() t.fd(40) drawGap() t.right(90) def drawText(): t.right(90) t.fd(40) def drawDight(num): drawLine(True) if num in [2, 3, 4, 5, 6, 8, 9] else drawLine(False) drawLine(True) if num in [0, 1, 3, 4, 5, 6, 7, 8, 9] else drawLine(False) drawLine(True) if num in [0, 2, 3, 5, 6, 8, 9] else drawLine(False) drawLine(True) if num in [0, 2, 6, 8] else drawLine(False) t.left(90) drawLine(True) if num in [0, 4, 5, 6, 8, 9] else drawLine(False) drawLine(True) if num in [0, 2, 3, 5, 6, 7, 8, 9] else drawLine(False) drawLine(True) if num in [0, 1, 2, 3, 4, 7, 8, 9] else drawLine(False) t.up() t.left(180) t.fd(20) def get_data(data): for i in data: if i == '/': drawText() t.write('年', font=("Arial", 50, "normal")) t.pencolor('green') txt_center() elif i == '-': drawText() t.write('月', font=("Arial", 50, "normal")) t.pencolor('blue') txt_center() elif i == '+': drawText() t.write('日', font=("Arial", 50, "normal")) else: drawDight(eval(i)) # 主函数 def main(): turtle.setup(1000, 600) t.up() t.backward(400) t.pencolor('red') t.pensize(5) t.down() get_data(time.strftime('%Y/%m-%d+', time.gmtime())) main() turtle.done()