?? 編程基礎第一期《6-30》–簡易計時器/秒表,這是一個使用Python的turtle和time模塊實現的簡易計時器/秒表程序,提供簡潔的數字時間顯示。
目錄
- 🌟 功能特點
- 🚀 使用方法
- 🧩 程序架構設計
- 💻 代碼詳解
- 窗口和畫筆創建
- 時間和狀態顯示更新
- 計時器控制邏輯
- 計時器重置功能
- 事件監聽設置
- 主循環及運行控制
- 🚀總
- ?今日分享語錄
🌟 功能特點
- 數字顯示當前計時(時:分:秒.毫秒)
- 支持開始/暫停計時(空格鍵)
- 支持重置計時(R鍵)
- 狀態顯示(正在計時/已暫停/按空格鍵開始計時)
- 清晰的操作提示
🚀 使用方法
- 運行程序后,會顯示初始時間(00:00:00.000)
- 按下空格鍵開始計時
- 再次按下空格鍵暫停計時
- 按下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()
效果:
?今日分享語錄
“低級的欲望靠放縱,高級的欲望靠自律。”