练习:七段数码管的实现。知识点: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()
