使用Python Turtle实现精确计时工具的图形化秒表创建指南

⏱️ 编程基础第一期《6-30》–简易计时器/秒表,这是一个使用Python的turtle和time模块实现的简易计时器/秒表程序,提供简洁的数字时间显示。

目录

  • 🌟 功能特点
  • 🚀 使用方法
  • 🧩 程序架构设计
  • 💻 代码详解
  • 窗口和画笔创建
  • 时间和状态显示更新
  • 计时器控制逻辑
  • 计时器重置功能
  • 事件监听设置
  • 主循环及运行控制
  • 🚀总
  • ✨今日分享语录

  • 🌟 功能特点

    1. 数字显示当前计时(时:分:秒.毫秒)
    2. 支持开始/暂停计时(空格键)
    3. 支持重置计时(R键)
    4. 状态显示(正在计时/已暂停/按空格键开始计时)
    5. 清晰的操作提示

    🚀 使用方法

    1. 运行程序后,会显示初始时间(00:00:00.000)
    2. 按下空格键开始计时
    3. 再次按下空格键暂停计时
    4. 按下R键可以重置计时器回到00:00:00.000

    🧩 程序架构设计

  • 核心模块:

  • turtle: 提供跨平台的图形化界面绘制功能
  • time: 提供高精度的系统时间获取功能
  • 设计模式:

  • 采用事件驱动编程模型,通过键盘事件触发状态变更
  • 利用全局状态管理计时器状态
  • 算法原理:

  • 时间计算:利用系统时间差值计算经过时间
  • 状态管理:使用布尔变量控制计时器运行状态
  • 💻 代码详解

    窗口和画笔创建

    import turtle
    import time
    
    # 设置窗口和基本参数
    screen = turtle.Screen()
    screen.title("简易计时器/秒表")
    screen.bgcolor("black")
    screen.setup(width=500, height=300)
    screen.tracer(0)  # 关闭自动刷新
    
    # 创建显示时间的画笔
    time_display = turtle.Turtle()
    time_display.hideturtle() # 隐藏turtle的箭头图标,使绘图时只显示图形而不显示箭头
    time_display.color("cyan") # 设置turtle绘图的颜色
    time_display.penup()   #抬起turtle的笔,这样移动turtle时不会绘制线条
    time_display.goto(0, 30)  # 将turtle移动到坐标(0, 30)的位置,准备从该点开始绘图或显示文本
    
    # 创建状态显示的画笔
    status_display = turtle.Turtle()
    status_display.hideturtle()
    status_display.speed(0)
    status_display.color("white")
    status_display.penup()
    status_display.goto(0, -30)
    
    # 创建操作提示的画笔
    help_display = turtle.Turtle()
    help_display.hideturtle()
    help_display.speed(0)
    help_display.color("yellow")
    help_display.penup()
    help_display.goto(0, -80)
    help_display.write("空格键: 开始/暂停 | R键: 重置", align="center", font=("Arial", 14, "normal"))
    
    # 初始化秒表变量
    is_running = False
    start_time = 0
    accumulated_time = 0
    

    应用知识点:

  • Turtle图形对象: 创建多个Turtle对象分别负责不同UI元素的显示
  • 窗口控制: 使用screen.tracer(0)关闭自动刷新以提高性能
  • 坐标系统: 使用二维坐标系统合理布局界面元素
  • 全局状态变量: 使用全局变量跟踪计时器状态
  • 时间和状态显示更新

    # 更新时间显示
    def update_time_display(elapsed_time):
        hours = int(elapsed_time / 3600)
        minutes = int((elapsed_time % 3600) / 60)
        seconds = int(elapsed_time % 60)
        milliseconds = int((elapsed_time * 1000) % 1000)
        
        time_str = f"{hours:02d}:{minutes:02d}:{seconds:02d}.{milliseconds:03d}"
        time_display.clear()
        time_display.write(time_str, align="center", font=("Arial", 40, "bold"))
    
    # 更新状态显示
    def update_status():
        status_display.clear()
        if is_running:
            status = "正在计时..."
        else:
            if accumulated_time > 0:
                status = "已暂停"
            else:
                status = "按空格键开始计时"
        status_display.write(status, align="center", font=("Arial", 20, "normal"))
    

    应用知识点:

  • 时间单位转换: 将秒数转换为时、分、秒、毫秒
  • 取余与整除运算: 使用整除和取余操作进行时间单位分解
  • 字符串格式化: 使用f-string和格式说明符控制显示格式
  • 状态条件判断: 根据多种状态组合提供不同的用户反馈
  • 计时器控制逻辑

    def toggle_timer():
        global is_running, start_time, accumulated_time
        
        if is_running:
            # 暂停计时
            is_running = False
            accumulated_time += time.time() - start_time
        else:
            # 开始计时
            is_running = True
            start_time = time.time()
        
        update_status()
    

    应用知识点:

  • 全局变量修改: 使用global关键字在函数内修改全局状态
  • 高精度时间获取: 使用time.time()获取高精度Unix时间戳
  • 状态切换设计: 实现简洁的状态切换逻辑
  • 计时器重置功能

    def reset_timer():
        global is_running, start_time, accumulated_time
        is_running = False
        accumulated_time = 0
        start_time = 0
        update_status()
        update_time_display(0)
    

    应用知识点:

  • 状态重置: 将所有计时相关变量重置为初始值
  • 函数复用: 复用更新显示的函数,避免代码冗余
  • 事件监听设置

    # 设置键盘事件
    screen.listen()
    screen.onkeypress(toggle_timer, "space")  # 空格键开始/暂停
    screen.onkeypress(reset_timer, "r")       # R键重置
    

    应用知识点:

  • 事件监听机制: 使用listen()方法启用事件监听
  • 回调函数绑定: 将键盘事件与特定函数绑定
  • 函数引用传递: 将函数名作为参数传递,不带括号
  • 主循环及运行控制

    def main():
        # 初始显示
        update_status()
        update_time_display(0)
        
        while True:
            if is_running:
                elapsed_time = accumulated_time + (time.time() - start_time)
            else:
                elapsed_time = accumulated_time
            
            update_time_display(elapsed_time)
            screen.update()
            time.sleep(0.01)  # 小延迟减轻CPU负担
    
    # 启动程序
    if __name__ == "__main__":
        try:
            main()
        except:
            print("程序已退出")
        turtle.done() 
    

    应用知识点:

  • 无限循环: 使用while True创建游戏主循环
  • 条件计时: 根据运行状态计算不同的时间值
  • 手动屏幕刷新: 使用screen.update()手动刷新画面
  • 定时延迟: 使用time.sleep()控制循环速率,减轻CPU负担
  • 异常处理: 使用try-except捕获可能的异常,确保程序优雅退出
  • 入口点检查: 使用if __name__ == "__main__":确保直接运行时才执行主函数
  • 🚀总

    import turtle
    import time
    
    # 设置窗口和基本参数
    screen = turtle.Screen()
    screen.title("简易计时器/秒表")
    screen.bgcolor("black")
    screen.setup(width=500, height=300)
    screen.tracer(0)  # 关闭自动刷新
    
    # 创建显示时间的画笔
    time_display = turtle.Turtle()
    time_display.hideturtle() # 隐藏turtle的箭头图标,使绘图时只显示图形而不显示箭头
    time_display.color("cyan") # 设置turtle绘图的颜色
    time_display.penup()   #抬起turtle的笔,这样移动turtle时不会绘制线条
    time_display.goto(0, 30)  # 将turtle移动到坐标(0, 30)的位置,准备从该点开始绘图或显示文本
    
    # 创建状态显示的画笔
    status_display = turtle.Turtle()
    status_display.hideturtle()
    status_display.speed(0)
    status_display.color("white")
    status_display.penup()
    status_display.goto(0, -30)
    
    # 创建操作提示的画笔
    help_display = turtle.Turtle()
    help_display.hideturtle()
    help_display.speed(0)
    help_display.color("yellow")
    help_display.penup()
    help_display.goto(0, -80)
    help_display.write("空格键: 开始/暂停 | R键: 重置", align="center", font=("Arial", 14, "normal"))
    
    # 初始化秒表变量
    is_running = False
    start_time = 0
    accumulated_time = 0
    
    
    # 更新时间显示
    def update_time_display(elapsed_time):
        hours = int(elapsed_time / 3600)
        minutes = int((elapsed_time % 3600) / 60)
        seconds = int(elapsed_time % 60)
        milliseconds = int((elapsed_time * 1000) % 1000)
    
        time_str = f"{hours:02d}:{minutes:02d}:{seconds:02d}.{milliseconds:03d}"
        time_display.clear()
        time_display.write(time_str, align="center", font=("Arial", 40, "bold"))
    
    
    # 更新状态显示
    def update_status():
        status_display.clear()
        if is_running:
            status = "正在计时..."
        else:
            if accumulated_time > 0:
                status = "已暂停"
            else:
                status = "按空格键开始计时"
        status_display.write(status, align="center", font=("Arial", 20, "normal"))
    
    
    def toggle_timer():
        global is_running, start_time, accumulated_time
    
        if is_running:
            # 暂停计时
            is_running = False
            accumulated_time += time.time() - start_time
        else:
            # 开始计时
            is_running = True
            start_time = time.time()
    
        update_status()
    
    def reset_timer():
        global is_running, start_time, accumulated_time
        is_running = False
        accumulated_time = 0
        start_time = 0
        update_status()
        update_time_display(0)
    # 设置键盘事件
    screen.listen()
    screen.onkeypress(toggle_timer, "space")  # 空格键开始/暂停
    screen.onkeypress(reset_timer, "r")       # R键重置
    
    
    def main():
        # 初始显示
        update_status()
        update_time_display(0)
    
        while True:
            if is_running:
                elapsed_time = accumulated_time + (time.time() - start_time)
            else:
                elapsed_time = accumulated_time
    
            update_time_display(elapsed_time)
            screen.update()
            time.sleep(0.01)  # 小延迟减轻CPU负担
    
    
    # 启动程序
    if __name__ == "__main__":
        try:
            main()
        except:
            print("程序已退出")
        turtle.done() 
    

    效果

    ✨今日分享语录

    “低级的欲望靠放纵,高级的欲望靠自律。”

    作者:笨笨轻松熊

    物联沃分享整理
    物联沃-IOTWORD物联网 » 使用Python Turtle实现精确计时工具的图形化秒表创建指南

    发表回复