学习笔记-七段数码管绘制-动态刷新

中国大学MOOC嵩天老师的Python程序语言设计课程第5.2节

举一反三思考如何实现带动态刷新的七段数码管的绘制?

既然是动态刷新,说明七段数码管绘制中的主函数main需要重复不断打印输出;

1,那么我们需要用上while Ture循环语句来实现无限循环,且因为时间以每秒走,所以我们设置休眠时间为一秒;

def main():
    while True:
        t.setup(800, 350, 200, 200)
        t.penup()
        t.fd(-300)
        t.pensize(5)
        t.tracer(False)  # 隐藏绘图,直接显示结果
        drawDate(time.strftime("%H-%M=%S+", time.gmtime()))  #将模板设置为"小时-分钟=秒+"
        t.hideturtle()
        time.sleep(1)
    t.done()

绘画效果:

学习笔记-七段数码管绘制-动态刷新_第1张图片

我们发现重复输出后绘图出现重叠

2,这时候我们需要用上turtle库中的全局控制命令reset()来清空窗口,重置turtle状态为起止状态。

def main():
    while True:
        t.reset()  #清空窗口,重置turtle状态为起止状态
        t.setup(800, 350, 200, 200)
        t.penup()
        t.fd(-300)
        t.pensize(5)
        t.tracer(False)  # 隐藏绘图,直接显示结果
        drawDate(time.strftime("%H-%M=%S+", time.gmtime()))  #将模板设置为"小时-分钟=秒+"
        t.hideturtle()
        time.sleep(1)
    t.done()

绘画效果:

学习笔记-七段数码管绘制-动态刷新_第2张图片

3,细心的我发现当前获得的时间并非北京时间,这里查找了一下问题发现gmtime()函数获取的时间是格林尼治时间(英国的标准时间),与北京时间相差6个小时。来源:python中ctime和gmtime获取的时间不一样

这时为了解决这个问题,我们引入一个datetime库,使用datetime.datetime.now()来获取当前时间

def main():
    while True:
        t.reset()  清空窗口,重置turtle状态为起止状态
        t.setup(800, 350, 200, 200)        
        t.penup()
        t.fd(-300)
        t.pensize(5)
        t.tracer(False)  # 隐藏绘图,直接显示结果
        t.hideturtle()
        drawDate(datetime.datetime.now().strftime('%H-%M=%S+'))  #将模板设置为"小时-分钟=秒+"
        time.sleep(1)
    t.done()

绘画效果:

学习笔记-七段数码管绘制-动态刷新_第3张图片

4,完整代码

# 开发时间 2021/2/21 23:00
import turtle as t
import time
import datetime

def drawGap():  # 绘制数码管间隔
    t.penup()
    t.fd(5)


def drawLine(draw):  # 绘制单段数码管
    drawGap()
    t.pendown() if draw else t.penup()
    t.fd(40)
    drawGap()
    t.right(90)


def drawDight(dight):  # 根据数字绘制七段数码管
    drawLine(True) if dight in [2, 3, 4, 5, 6, 8, 9] else drawLine(False)
    drawLine(True) if dight in [0, 1, 3, 4, 5, 6, 7, 8, 9] else drawLine(False)
    drawLine(True) if dight in [0, 2, 3, 5, 6, 8, 9] else drawLine(False)
    drawLine(True) if dight in [0, 2, 6, 8] else drawLine(False)
    t.left(90)
    drawLine(True) if dight in [0, 4, 5, 6, 8, 9] else drawLine(False)
    drawLine(True) if dight in [0, 2, 3, 5, 6, 7, 8, 9] else drawLine(False)
    drawLine(True) if dight in [0, 1, 2, 3, 4, 7, 8, 9] else drawLine(False)
    t.left(180)
    t.penup()  # 为绘制后续数字确定位置
    t.fd(20)  # 为绘制后续数字确定位置


def drawDate(date):
    t.pencolor("red")
    for i in date:
        if i == '-':
            t.write('时', font=("Arial", 18, "normal"))
            t.pencolor("green")
            t.fd(40)
        elif i == '=':
            t.write('分', font=("Arial", 18, "normal"))
            t.pencolor("blue")
            t.fd(40)
        elif i == '+':
            t.write('秒', font=("Arial", 18, "normal"))
        else:
            drawDight(eval(i))


def main():
    while True:
        t.reset()  清空窗口,重置turtle状态为起止状态
        t.setup(800, 350, 200, 200)        
        t.penup()
        t.fd(-300)
        t.pensize(5)
        t.tracer(False)  # 隐藏绘图,直接显示结果
        t.hideturtle()
        drawDate(datetime.datetime.now().strftime('%H-%M=%S+'))  #将模板设置为"小时-分钟=秒+"
        time.sleep(1)
    t.done()


main()

 

你可能感兴趣的:(python)