使用turtle模块模拟动态时钟

turtle 是 Python 的一个标准库模块,它提供了一个绘图板(通常称为画布)和一个小海龟(Turtle),你可以控制这个小海龟在画布上移动,从而绘制出各种图形和图案。这个模块非常适合初学者学习编程,因为它提供了一种直观的方式来理解程序的执行流程,同时也可以用来教授编程的基本概念,如循环、条件判断和函数等。

以下是 turtle 模块的一些基本功能和用法:

  • 初始化画布和Turtle:当你导入 turtle 模块并创建一个 Turtle 对象时,会自动打开一个窗口,显示一个空白的画布和一个起点在画布中心的小海龟。

  • 移动Turtle:你可以使用 forward()backward()left()right() 等方法来控制小海龟的移动。

  • 绘制图形:通过移动小海龟并绘制线条,你可以绘制出各种图形,如正方形、圆形、多边形等。

  • 提升和放下笔:使用 penup() 方法可以提升笔,使小海龟移动时不绘制线条;pendown() 方法可以放下笔,恢复绘制。

  • 改变画笔大小和颜色pensize() 方法可以改变绘制线条的粗细,color() 方法可以改变线条的颜色。

  • 循环和重复:你可以使用循环结构来重复绘制相同的图案或图形,创建复杂的图案。

  • 定义形状turtle 允许你定义和使用自定义形状,这可以通过 register_shape() 方法实现。

  • 事件循环mainloop()done() 方法会启动 turtle 的事件循环,使程序保持运行状态,直到你关闭窗口。

  • 动画效果:通过控制小海龟的移动速度和绘制动作,你可以创建动画效果。

turtle 模块的这些功能使得它成为一个强大的工具,可以用来创建艺术作品、教学演示、游戏原型等。它也是许多编程入门课程和教材中的常用工具。

import turtle                 # 导入绘图海龟模块
import datetime               # 导入日期时间模块

# 移动一段距离
def skip(distance):          # 移动方法,不留移动痕迹
    turtle.penup()           # 抬笔不绘制
    turtle.forward(distance) # 移动指定距离
    turtle.pendown()         # 落笔移动绘制

def draw_clock_dial():            # 绘制表盘的方法
    turtle.reset()           # 删除图形归位
    turtle.hideturtle()       # 隐藏箭头
    for i in range(60):       # 循环执行60次,一圈为360度所以每一秒的角度为6度
        skip(160)              # 移动160,相当于表盘圆的半径
        # 每5秒绘制一个小时刻度
        if i % 5 == 0:
            turtle.pensize(7)       # 刻度大小
            # 画时钟
            turtle.forward(20)       # 小时刻度的长度为20
            # if i == 0:               # 判断第一个位置为12点
            #     # 写入数字12
            #     turtle.write(12, align='center', font=('Courier', 14, 'bold'))
            # elif i == 25 or i == 30 or i == 35:    # 5、6、7
            #     skip(25)   # 避免与刻度重叠,所以多移动一段距离
            #     # 根据i除以5获取,5点、6点、7点并写入对应的数字
            #     turtle.write(int(i/5), align='center', font=('Courier', 14, 'bold'))
            #     skip(-25)  # 回到原位置
            # else:
            #     # 根据i除以5获取其它时间的数字并写入
            #     turtle.write(int(i/5), align='center', font=('Courier', 14, 'bold'))
            skip(-20)      # 复原小时刻度的位置
        else:
            turtle.pensize(1)      # 将画笔大小设置为1
            turtle.dot()           # 绘制分钟刻度的小圆点
        skip(-160)                 # 回到中心位置
        turtle.right(6)            # 向右旋转6度


def get_week(t):                   # 获取星期的方法
    week = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日']
    return week[t.weekday()]       # 返回当天的星期


def create_pointer(length, name):     # 创建指针方法
    turtle.reset()                 # 删除图形归位
    skip(-length * 0.1)            # 抬笔移动指定距离
    turtle.begin_poly()            # 记录多边形
    turtle.forward(length * 1.1)   # 绘制指定长度的指针
    turtle.end_poly()              # 停止记录多边形
    # 注册多边形状
    turtle.register_shape(name, turtle.get_poly())

def init_pointer():                # 初始化指针
    global secHand, minHand, hurHand, printer
    turtle.mode("logo")              # 重置Turtle指向上
    create_pointer(135,"secHand")       # 创建秒针图形
    create_pointer(110,"minHand")       # 创建分针图形
    create_pointer(90,"hurHand")        # 创建时针图形
    secHand = turtle.Turtle()        # 创建秒针turtle对象
    secHand.shape("secHand")         # 创建指定秒针名称的形状
    minHand = turtle.Turtle()        # 创建分针turtle对象
    minHand.shape("minHand")         # 创建指定分针名称的形状
    hurHand = turtle.Turtle()        # 创建时针turtle对象
    hurHand.shape("hurHand")         # 创建指定时针名称的形状
    for hand in secHand, minHand, hurHand:   # 循环遍历三个指针
        hand.shapesize(1, 1, 5)              # 设置形状拉伸大小和轮廓线
        hand.speed(0)                        # 设置速度为最快
    printer = turtle.Turtle()                # 创建绘制文字的Turtle对象
    printer.hideturtle()                     # 隐藏箭头
    printer.penup()                          # 抬笔

def move_pointer():                          # 移动指针的方法
    # 不停的获取时间
    t = datetime.datetime.today()
    second = t.second + t.microsecond * 0.000001    # 计算移动的秒
    minute = t.minute + second/60                   # 计算移动的分
    hour = t.hour + minute/60                       # 计算移动的小时
    secHand.setheading(6*second)                     # 设置秒针的角度
    minHand.setheading(6*minute)                     # 设置分针的角度
    hurHand.setheading(30*hour)                      # 设置时针的角度
    turtle.tracer(False)                             # 关闭绘画效果
    printer.forward(65)                              # 向上移动65
    # 绘制星期
    printer.write(get_week(t), align="center",font=("Courier", 14, "bold"))
    printer.back(130)                                # 倒退130
    # 绘制年月日
    printer.write(t.strftime('%Y-%m-%d'), align="center",font=("Courier", 14, "bold"))
    printer.home()                                   # 归位
    turtle.tracer(True)                              # 开启绘画效果
    turtle.ontimer(move_pointer, 10)                 # 10毫秒后调用move_pointer()方法

if __name__ == '__main__':
    turtle.setup(450, 450)      # 创建窗体大小
    init_pointer()              # 调用初始化指针的方法
    turtle.tracer(False)        # 关闭绘画效果
    draw_clock_dial()            # 绘制表盘
    move_pointer()               # 调用移动指针的方法
    turtle.mainloop()            # 不关闭窗体

下面是代码的主要功能和组成部分的解释:

  1. 导入模块:程序开始处导入了 turtle 模块用于绘制图形,以及 datetime 模块用于获取当前时间。

  2. 辅助函数

    • skip(distance):移动海龟指定的距离,但不绘制线条。
    • draw_clock_dial():绘制时钟的表盘,包括60个刻度。
  3. 绘制表盘:使用 for 循环绘制表盘上的刻度,每5秒一个长刻度,其它为短刻度。

  4. 获取星期get_week(t) 函数根据提供的日期时间对象 t 返回对应的星期名称。

  5. 创建指针create_pointer(length, name) 函数用于创建时钟指针的形状,并通过 turtle.register_shape 注册为 turtle 可以使用的形状。

  6. 初始化指针init_pointer() 函数初始化秒针、分针和时针的 turtle 对象,并设置它们的形状和大小。

  7. 移动指针move_pointer() 函数不断更新时钟指针的位置以反映当前时间。它使用 datetime.datetime.today() 获取当前时间,并计算出秒针、分针和时针应该指向的角度。然后,它更新指针的位置,并绘制当前的星期和日期。

  8. 主程序:在程序的主部分,设置窗体大小,调用初始化指针的函数,绘制表盘,启动指针移动,并进入主循环以保持窗体打开。

这个程序创建了一个图形界面,显示了一个动态更新的时钟,包括时针、分针、秒针,以及当前的星期和日期。指针的移动是通过定时器函数 turtle.ontimer 实现的,它每10毫秒调用一次 move_pointer() 函数来更新时钟。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值