• 第一个python小程序——即时动态时钟(代码解读)


    (程序开始阶段——上一篇博客:https://www.cnblogs.com/love528/p/9873526.html

    代码资源来自:

    http://n.miaopai.com/media/K9Qlou7rdPc5TxpPaL1VDvwfv5hP~lHK   (运行有错误,缺少date,week和结尾部分)

    https://blog.csdn.net/yangxing2/article/details/78637472/

    一、完整代码:

    # coding=UTF-8
    from turtle import *
    from datetime import *
    
    def Skip(step):               #建立表的外框
        penup()
        forward(step)
        pendown()
    
    def mkHand(name,length):      #注册turtle形状,建立表针turtle
        reset()
        Skip(-length*0.1)
        begin_poly()
        forward(length*1.1)
        end_poly()
        handForm = get_poly()
        register_shape(name,handForm)
    
    def Init():
        global secHand,minHand,hurHand,printer
        mode("logo")             #重置turtle指向北
    
        mkHand("secHand",125)    #建立三个表针并初始化
        mkHand("minHand",130)
        mkHand("hurHand",90)
    
        secHand = Turtle()
        secHand.shape("secHand")
        minHand = Turtle()
        minHand.shape("minHand")
        hurHand = Turtle()
        hurHand.shape("hurHand")
    
        for hand in secHand,minHand,hurHand:
            hand.shapesize(1,1,3)
            hand.speed(0)
    
        printer = Turtle()        #建立输出文字turtle
        printer.hideturtle()
        printer.penup()
    
    def SetupClock(radius):      #建立表外框
        reset()
        pensize(7)
        for i in range(60):
            Skip(radius)
            if i % 5 == 0:
                forward(20)
                Skip(-radius-20)
            else:
                dot(5)
                Skip(-radius)
            right(6)
    
    def Week(t):
        week = ["Mon", "Tues", "Wed","Thur", "Fri", "Sat", "Sun"]
        return week[t.weekday()]
    
    def Date(t):
        y = t.year
        m = t.month
        d = t.day
        return "%s %d %d" % (y, m, d)
    def Tick():
        t = datetime.today()
        second = t.second + t.microsecond * 0.000001
        minute = t.minute + second/60.0
        hour = t.hour + minute/60.0
        secHand.setheading(6*second)
        minHand.setheading(6*minute)
        hurHand.setheading(30*hour)
        tracer(False)
        printer.forward(65)
        printer.write(Week(t),align="center",font=("Courier",14,"bold"))
        printer.back(130)
        printer.write(Date(t),align="center",font=("Courier",14,"bold"))
        printer.home()
        tracer(True)
        ontimer(Tick,100)                #100ms后继续调用tick
    
    def main():
        tracer(False)
        Init()
        SetupClock(160)
        tracer(True)
        Tick()
        mainloop()
    if __name__ == "__main__":
        main()

    二、运行结果截图

    三、程序解读

    1、思路

      需求:5个Turtle对象, 1个绘制外表盘+1个输出文字++3个模拟表上针
      Step1:建立5个Turtle对象并初始化 (表盘绘制和文本输出对象是turtle常见的对象方式;turtle的外观shape就是指针形状,在每一时刻以轴心为圆心旋转了一定角度)
      Step2:静态表盘绘制 
      Step3:根据时钟更新表针位置与时间信息 
      基本库:Turtle、datetime

    2、代码

    (1)from turtle import *

      Turtle库——Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟(画笔),在一个横轴为x、纵轴为y的坐标系(画布),根据一组函数指令的控制,在平面坐标系中移动,从而在它爬行的路径上绘制了图形。

            操纵海龟绘图有3种命令:

        运动命令

        

        画笔控制命令

        

        全局控制命令

         

        还有其他命令

        

    (2)from datetime import *

      datetime模块重新封装了time模块,提供了更多处理日期和时间的接口。包含以下几个类和两个常量:

      

      

      每个类中定义了很多属性和方法,包括对时间的调用及格式转换等问题在此不再赘述。

    (3)几个重要的函数  (代码中的函数写成mode(),而不用写成turtle.mode(),是因为turtle是python的标准库,在python项目里不会提示“unresolved reference ‘xxx’”,但在解释器为python2.7的python文件中不会有提示。此提示不影响代码运行)

      SetupClock(radius):        绘制表盘,表盘半径radius为参数

        设置画笔大小,通过60次循环绘制刻度,每5个刻度为短线段,其余为小圆点。

      Skip(step):                       由于表盘刻度不连续,需频繁抬起画笔,放下画笔

      mkHand(name,length):    定义指针几何形状。

        使用两个函数begin_poly() 、end_poly()记录多边形形状,register_shape函数将handForm几何形状注册为合法的turtle外形.

      Init():                                初始化表针和文本对象

      Tick():                              绘制表针的动态显示

        获取当前的时分秒,设置每个指针转动的角度,绘制星期与日期文本,每隔100ms调用此函数更新时间

      tracer(False) :                  实现绘制的效果同时出现,用tracer函数控制刷新,false时动画关闭,绘制结束后一致刷新;true时恢复动画的绘制效果

         mainloop():                      启动事件循环 -调用Tkinter的mainloop函数。必须是乌龟图形程序中的最后一个语句。

    the end.......

  • 相关阅读:
    Syncfusion Essential DocIO操作word文件实用函数
    用Ubuntu破解wep无线加密
    Wubi 安装的 Ubuntu 在引导时进入grub,无法进入系统的解决办法
    Ubuntu 下挂ISO到虚拟光驱的方法
    令人失望的联通3G
    个性的国度
    也谈人脸识别
    红日
    在应用程序里识别UserAgent对应的浏览器
    缘起
  • 原文地址:https://www.cnblogs.com/love528/p/9873614.html
Copyright © 2020-2023  润新知