Python入门——实现简易数码时钟

发布时间:2019-09-07 07:58:59编辑:auto阅读(1964)

    最近迷上了Python,要说为什么呢?Python语法简单,功能强大,有广泛的第三方库能快速编程实现自己的想法(无需重复去造轮子)。就像某位前辈说的:“人生苦短,学会偷懒…”,配置好sublime text照着网上教程直接上手写个小程序入门。

    先插张图,计算机技术的演进过程,总结的还是挺到位的。

    安装好Python环境,引入需要用到的库:

    import threading
    import turtle
    import time

    引入time库后使用localtime()方法可以获取当前服务器时间,然后使用turtle库绘制7段数码管时钟。

    now = time.localtime()  # 返回服务器时间
    
    print(now)
    print(time.strftime("%Y-%m-%d %H:%M:%S", now))
    
    # 转成字符串
    # %y 两位数的年份表示(00-99)
    # %Y 四位数的年份表示(000-9999)
    # %m 月份(01-12)
    # %d 月内中的一天(0-31)
    # %H 24小时制小时数(0-23)
    # %I 12小时制小时数(01-12)
    # %M 分钟数(00=59)
    # %S 秒(00-59)
    # %a 本地简化星期名称
    # %A 本地完整星期名称
    # %b 本地简化的月份名称
    # %B 本地完整的月份名称
    # %c 本地相应的日期表示和时间表示
    # %j 年内的一天(001-366)
    # %p 本地A.M.或P.M.的等价符
    # %U 一年中的星期数(00-53)星期天为星期的开始
    # %w 星期(0-6),星期天为星期的开始
    # %W 一年中的星期数(00-53)星期一为星期的开始
    # %x 本地相应的日期表示
    # %X 本地相应的时间表示
    # %Z 当前时区的名称
    # %% %号本身

    绘制数码管函数:

    # 绘制单根数码管
    def drawLine(draw):
        turtle.pensize(3)
        turtle.pu
        turtle.fd(3)
        if draw:
            turtle.pd()
        else:
            turtle.pu()
    
        turtle.fd(24)
        turtle.pu()
        turtle.fd(3)
        turtle.right(90)
    
    
    # 根据数字绘制数码管
    def drawNum(num, color):
        turtle.colormode(255)
        turtle.color(eval(color))
        # 第一条线
        if num in [2, 3, 4, 5, 6, 8, 9]:
            drawLine(True)
        else:
            drawLine(False)
    
        if num in [0, 1, 3, 4, 5, 6, 7, 8, 9]:
            drawLine(True)
        else:
            drawLine(False)
    
        if num in [0, 2, 3, 5, 6, 8, 9]:
            drawLine(True)
        else:
            drawLine(False)
    
        if num in [0, 2, 6, 8]:
            drawLine(True)
        else:
            drawLine(False)
    
        turtle.left(90)
    
        if num in [0, 4, 5, 6, 8, 9]:
            drawLine(True)
        else:
            drawLine(False)
    
        if num in [0, 2, 3, 5, 6, 7, 8, 9]:
            drawLine(True)
        else:
            drawLine(False)
    
        if num in [0, 1, 2, 3, 4, 7, 8, 9]:
            drawLine(True)
        else:
            drawLine(False)
    
        turtle.pu()
        turtle.left(180)
        turtle.fd(30)  # 绘制后面数字间隔位置
        turtle.update()

    一个7段数码管全部绘制(显示数字8)顺序如下,根据显示的数字来决定哪些需要绘制,哪些只是抬起画笔移动不进行绘制,所以绘制单段数码管的函数内设置了一个参数draw。

    定义一个Tick函数,利用threading库实现定时刷新:

    def Tick():
        now = time.localtime()
        now_time.n_sec = now.tm_sec
        turtle.reset()
        turtle.hideturtle()
        turtle.pu()
        turtle.fd(-300)
    
        darwDate(str(now.tm_year), '(255, 69, 0)')
        turtle.fd(10)
        turtle.right(90)
        turtle.fd(30)
        turtle.write('年', align="center", font=("Courier", 30, "bold"))
        turtle.left(180)
        turtle.fd(30)
        turtle.right(90)
        turtle.fd(30)
    
        darwDate(str(now.tm_mon), '(0,139,0)')
        turtle.fd(10)
        turtle.right(90)
        turtle.fd(30)
        turtle.write('月', align="center", font=("Courier", 30, "bold"))
        turtle.left(180)
        turtle.fd(30)
        turtle.right(90)
        turtle.fd(30)
    
        darwDate(str(now.tm_mday), '(0,0,139)')
        turtle.fd(10)
        turtle.right(90)
        turtle.fd(30)
        turtle.write('日', align="center", font=("Courier", 30, "bold"))
        turtle.left(180)
        turtle.fd(-90)
        turtle.right(90)
        turtle.fd(-510)
    
        darwDate(str(now.tm_hour))
        turtle.fd(10)
        turtle.right(90)
        turtle.fd(30)
        turtle.write('时', align="center", font=("Courier", 30, "bold"))
        turtle.left(180)
        turtle.fd(30)
        turtle.right(90)
        turtle.fd(30)
    
        darwDate(str(now.tm_min))
        turtle.fd(10)
        turtle.right(90)
        turtle.fd(30)
        turtle.write('分', align="center", font=("Courier", 30, "bold"))
        turtle.left(180)
        turtle.fd(30)
        turtle.right(90)
        turtle.fd(30)
    
        darwDate(str(now.tm_sec))
        turtle.fd(10)
        turtle.right(90)
        turtle.fd(30)
        turtle.write('秒', align="center", font=("Courier", 30, "bold"))
        turtle.left(180)
        turtle.fd(30)
        turtle.right(90)
        turtle.fd(30)
    
        timer = threading.Timer(0.1, Tick)  # 利用多线程库定时刷新
        timer.start()
    

    最后定义一个入口函数:

    def mian():
        turtle.hideturtle()  # 隐藏画笔
        turtle.speed(0)  # 最快
        turtle.tracer(0)
        turtle.pu()
        turtle.fd(-300)
        Tick()
        turtle.done()
    # Python turtle模块的海龟作图,由于需要展示海龟运动的过程,缺省状态下,对作图进行了延迟处理,
    # 致使复杂图形的绘制速度过慢,可以用如下方法取消延迟,加速绘图:
    # 在绘图之前调用tracer
    # turtle.tracer(0)
    # 在绘图结束时调用update
    # turtle.update()
    
    mian()

    最终效果:

     

    代码写好后,可以打包成一个可执行文件,这里需要用到第三方库PyInstaller;安装第三方库Python封装了包管理工具pip确保安装时勾选了pip和Add python.exe to Path)。这里我用在线安装的方式,在cmd窗口直接运行:pip install 包名,如 pip install pyInstaller,注意:这种方式安装时会自动下载第三方库,安装完成后并不会删除,如需删除请到它的默认下载路径下手动删除。(win7的默认路径://AppData可能是隐藏文件夹 c:\用户\(你的用户名)\AppData\Local\pip\cache\ linux的默认路径: ~/.cache/pip)

    耐心等待下载并安装后,就可以使用PyInstaller了,在需要打包的文件目录下运行pyinstaller -F指令:

    打包后生成独立执行文件time.exe:

    打包时还可以通过–icon指令设置指定的图标,还有更多指令等以后用到的时候再研究。用了一段时间的Python,因为语法简洁所以代码的缩进很重要,这也算是一个小坑吧,不过熟能生巧,还需多多练习。

关键字