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_timeif is_running:# 暫停計時is_running = Falseaccumulated_time += time.time() - start_timeelse:# 開始計時is_running = Truestart_time = time.time()update_status()

應用知識點:

  • 全局變量修改: 使用global關鍵字在函數內修改全局狀態
  • 高精度時間獲取: 使用time.time()獲取高精度Unix時間戳
  • 狀態切換設計: 實現簡潔的狀態切換邏輯

計時器重置功能

def reset_timer():global is_running, start_time, accumulated_timeis_running = Falseaccumulated_time = 0start_time = 0update_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_timeupdate_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_timeif is_running:# 暫停計時is_running = Falseaccumulated_time += time.time() - start_timeelse:# 開始計時is_running = Truestart_time = time.time()update_status()def reset_timer():global is_running, start_time, accumulated_timeis_running = Falseaccumulated_time = 0start_time = 0update_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_timeupdate_time_display(elapsed_time)screen.update()time.sleep(0.01)  # 小延遲減輕CPU負擔# 啟動程序
if __name__ == "__main__":try:main()except:print("程序已退出")turtle.done() 

效果
在這里插入圖片描述

?今日分享語錄

“低級的欲望靠放縱,高級的欲望靠自律。”

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/910348.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/910348.shtml
英文地址,請注明出處:http://en.pswp.cn/news/910348.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【軌物方案】軌物科技|LoRaWAN 賦能智能光伏清掃,解鎖電站高效運維新時代

在大型集中式光伏電站的廣袤土地上,清掃機器人的高效運行是保障發電效率的關鍵。然而,傳統的無線通信方式在這些偏遠、無4G/5G信號覆蓋的區域,往往步履維艱。作為專注于工業物聯網解決方案的軌物科技,我們深知這些痛點&#xff0c…

Python函數實戰:從基礎到高級應用

Python-函數 Python 中可以使用def關鍵字來定義函數。 函數定義規則: 函數代碼塊以 def 關鍵詞開頭,后接函數標識符名稱和圓括號 ()。任何傳入參數和自變量必須放在圓括號中間,圓括號之間可以用于定義參數。函數的第一行語句可以選擇性地使…

Mac在局域網中突然很慢(包括SMB、NFS、SCP、SSH、Ping等場景均很慢)

今天 SMB 又突然好慢,大概只有 8-9 MB/s,而蘋果 SMB 很容易突然很慢是出了名的。我就想裝 NFS,但是 NFS 弄好之后還是很慢,我服了,我就檢查了scp等場景,都很慢,但是互聯網下載速度還是很快的。 …

UMAP:用于降維的均勻流形近似和投影實驗

關鍵詞: Uniform Manifold Approximation and Projection (UMAP):均勻流形近似與投影 一、說明 對于降維,首先看數據集是否線性,如果是線性的用pca降維;如果是非線性數據,t-SNE或者UMAP,本文針…

【Datawhale組隊學習202506】YOLO-Master task03 IOU總結

系列文章目錄 task01 導學課程 task02 YOLO系列發展線 文章目錄 系列文章目錄前言1 功能分塊1.1 骨干網絡 Backbone1.2 頸部網絡 Neck1.3 頭部網絡 Head1.3.1 邊界框回歸頭1.3.2 分類頭 2 關鍵概念3 典型算法3.1 NMS3.2 IoU 總結 前言 Datawhale是一個專注于AI與數據科學的開…

Spring IOC容器核心揭秘:BeanFactory創建、配置加載解析并注冊為BeanDefinition

文章目錄 一、為何這個階段如此重要?二、整體流程全景圖三、源碼級深度解析1. BeanFactory的誕生源碼入口:refresh()方法核心方法:obtainFreshBeanFactory()核心實現:refreshBeanFactory()BeanFactory實例化 2. ★ 核心&#xff1…

解鎖n8n:開啟工作流自動化的無限可能(5/6)

文章摘要:n8n 是一款開源低代碼工作流自動化平臺,通過可視化拖放節點創建復雜工作流,無需大量代碼。具有強大集成能力、數據轉換、錯誤處理等功能,適用于數據同步、客戶關系管理、IT 自動化等場景。相比 Zapier、IFTTT 等工具&…

數據賦能(308)——合作共享——數據交流

概述 重要性如下: 信息準確性:數據交流原則確保在數據傳遞過程中信息的準確性,這是決策和業務活動的基礎。決策支持:準確的數據交流為決策提供有力支持,幫助組織做出更明智的決策。業務效率:有效的數據交…

TCP流量控制與擁塞控制:核心機制與區別

一、TCP流量控制(Flow Control) 定義:通過調節發送方的發送速率,確保接收方能夠及時處理數據,避免緩沖區溢出。 本質:解決發送方與接收方之間的"端到端"速率匹配問題。 1. 實現機制&#xff1a…

iOS多端兼容性調試:一次iOS性能優化分工具協作排查過程

在多技術棧混合開發日益普及的今天,iOS應用中越來越多地集成了WebView、Flutter、React Native甚至小程序模塊。而這些模塊帶來的復雜性,不僅體現在UI適配,還包括數據同步、系統權限管理、線程調度等方面的問題。 本文記錄的是我們在處理一個…

秋招Day14 - MySQL - 索引

索引為什么能夠提高MySQL的查詢效率? 索引可以理解為目錄,通過索引可以快速定位數據,避免全表掃描 一般是B樹結構,查找效率是O(log n)。 索引還能加速排序、分組、連接等操作。 create index idx_name on students(name); 能簡…

第5天:LSTM預測火災溫度

🍨 本文為🔗365天深度學習訓練營 中的學習記錄博客🍖 原作者:K同學啊 目標 復用LSTM模型實現火災溫度預測 具體實現 (一)環境 語言環境:Python 3.10 編 譯 器: PyCharm 框 架: Pytorch &am…

目標檢測之YOLOV11自定義數據使用OBB訓練與驗證

一、前置條件與環境準備 在開始訓練前,確保已完成以下準備《目標檢測之YOLOV11自定義數據預處理——從原始標注到YOLO-OBB格式轉換與驗證》: 數據目錄結構: yolov11/ ├── datasets/ │ └── shrimp/ │ ├── images/ │ …

Labview教程進階一(Labview與OPC UA設備通信)

1.Labview與OPC UA設備通信 OPC UA通信協議優勢顯著,具體表現如下: 跨平臺兼容:支持多種操作系統和硬件平臺,實現無縫數據交換。高安全性:內置加密、身份驗證和授權機制,確保數據傳輸安全。高效數據交換:采用二進制編碼和優化的傳輸協議,提高通信效率。復雜數據建模:…

【Comsol教程】如何求解指定范圍的積分 或 在積分中去除奇異點/異常值

我們在Comsol中經常需要對物體的邊界求積分,比如求物體在流場中所受的總流體牽引力,又或者是物體在電場中受到的總介電泳力。當物體的材料或者邊界條件存在突變時,物體表面的粘性應力或者麥克斯韋電應力可能會存在異常值。通常解決方法有細化…

Python 多版本治理理念(Windows 平臺 · 零基礎友好)

🧠 Python 多版本治理理念(Windows 平臺 零基礎友好) 🌐 核心原則:三維治理、四級隔離、五項自治 以下是基于人工智能深度學習環境搭建實踐,總結出的"零基礎入門 Conda工具鏈 全隔離項目環境"…

Python文件管理利器之Shutil庫詳解

Shutil是一個Python內置的用來高效處理文件和目錄遷移任務的庫。Shutil不僅支持基本的文件復制、移動和刪除操作,還具備處理大文件、批量遷移目錄、以及跨平臺兼容性等特性。通過使用Shutil,我們可以更加輕松地實現文件系統的管理和維護,本文…

學習華為 ensp 的學習心得體會

引言? 在信息技術日新月異的今天,網絡技術作為連接世界的橋梁,其重要性不言而喻。作為一名對網絡技術充滿熱情的大一新生,我選擇了 eNSP(Enterprise Network Simulation Platform,企業網絡模擬平臺)作為我…

jenkins-2.439.1搭建

一、 二、pipeline文件 pipeline { agent any // 可以指定特定的agent, 如 label 或 docker environment { JAVA_HOME "/usr/local/software/jdk1.8.0_451" PATH "${JAVA_HOME}/bin:${env.PATH}" } tools { …

【threejs】一天一個小案例講解:控制面板(GUI)

# 好吧,每天更新實在有點艱巨,我盡量少量多次 代碼倉 所有代碼都會上傳到這里,可自行clone GitHub - TiffanyHoo/three_practices: Learning three.js together! 運行效果圖 ? 知識要點 一、安裝dat.gui npm i dat.gui 二、使用步驟&a…