Dong
下面给你一份可运行的 Python 秒表(Tkinter 图形界面):带有表盘、秒针,支持开始/暂停/复位。把下面代码保存为 stopwatch_clock.py 后直接运行即可。
import math
import time
import tkinter as tk
class StopwatchClock:
def __init__(self, root, size=360):
self.root = root
self.root.title("Stopwatch Clock")
# 尺寸与画布
self.size = size
self.cx = self.cy = size // 2
self.radius = int(self.size * 0.45)
self.canvas = tk.Canvas(root, width=self.size, height=self.size, bg="white", highlightthickness=0)
self.canvas.grid(row=0, column=0, columnspan=3, padx=10, pady=10)
# 控制按钮
self.btn_start = tk.Button(root, text="▶ 开始", width=10, command=self.start)
self.btn_pause = tk.Button(root, text="⏸ 暂停", width=10, command=self.pause)
self.btn_reset = tk.Button(root, text="⟲ 复位", width=10, command=self.reset)
self.btn_start.grid(row=1, column=0, padx=6, pady=8)
self.btn_pause.grid(row=1, column=1, padx=6, pady=8)
self.btn_reset.grid(row=1, column=2, padx=6, pady=8)
# 读数显示
self.time_var = tk.StringVar(value="00:00.00")
self.lbl_time = tk.Label(root, textvariable=self.time_var, font=("Consolas", 18))
self.lbl_time.grid(row=2, column=0, columnspan=3, pady=(0, 10))
# 状态
self.running = False
self.start_time = 0.0 # 本次开始的时间戳
self.elapsed = 0.0 # 累积用时(秒)
# 预绘表盘
self.draw_dial()
# 秒针对象(先画个占位)
self.second_hand = self.canvas.create_line(self.cx, self.cy, self.cx, self.cy - self.radius + 20,
width=3, fill="#d62728", capstyle=tk.ROUND)
# 中心圆点
self.center_dot = self.canvas.create_oval(self.cx-5, self.cy-5, self.cx+5, self.cy+5,
fill="#222", outline="")
# 定时刷新
self.update_loop()
# 绘制表盘(刻度与数字)
def draw_dial(self):
# 外圈
self.canvas.create_oval(self.cx - self.radius, self.cy - self.radius,
self.cx + self.radius, self.cy + self.radius,
outline="#222", width=3)
# 60个刻度
for i in range(60):
angle = math.radians(i * 6 - 90) # 12点方向为0度
# 主刻度(每5秒)加粗并更长
if i % 5 == 0:
r1 = self.radius - 18
r2 = self.radius
w = 3
else:
r1 = self.radius - 10
r2 = self.radius
w = 1
x1 = self.cx + r1 * math.cos(angle)
y1 = self.cy + r1 * math.sin(angle)
x2 = self.cx + r2 * math.cos(angle)
y2 = self.cy + r2 * math.sin(angle)
self.canvas.create_line(x1, y1, x2, y2, width=w, fill="#222")
# 数字(每5秒标一个:5,10,...60)
for i in range(1, 13):
# 每格5秒 => 12个数字
angle = math.radians(i * 30 - 90)
r_text = self.radius - 38
x = self.cx + r_text * math.cos(angle)
y = self.cy + r_text * math.sin(angle)
text = str(i * 5 if i < 12 else 60)
self.canvas.create_text(x, y, text=text, font=("Segoe UI", 11), fill="#333")
# 秒针根据 elapsed 旋转(elapsed 单位:秒)
def draw_second_hand(self, elapsed):
# 一圈60秒:角度 = (elapsed % 60) * 6 度
secs = elapsed % 60.0
ang = math.radians(secs * 6.0 - 90.0)
# 秒针长度稍短于外圈
length = self.radius - 20
x2 = self.cx + length * math.cos(ang)
y2 = self.cy + length * math.sin(ang)
self.canvas.coords(self.second_hand, self.cx, self.cy, x2, y2)
# 时间文本(mm:ss.cs,百分之一秒)
def format_time(self, t):
minutes = int(t // 60)
seconds = int(t % 60)
centi = int((t - int(t)) * 100)
return f"{minutes:02d}:{seconds:02d}.{centi:02d}"
# 开始
def start(self):
if not self.running:
self.running = True
self.start_time = time.perf_counter()
# 暂停
def pause(self):
if self.running:
self.running = False
# 累加这段区间
self.elapsed += time.perf_counter() - self.start_time
# 复位
def reset(self):
self.running = False
self.elapsed = 0.0
self.time_var.set("00:00.00")
self.draw_second_hand(0.0)
# 刷新循环(约每 20ms)
def update_loop(self):
current_elapsed = self.elapsed
if self.running:
current_elapsed += time.perf_counter() - self.start_time
# 更新表盘秒针与读数
self.draw_second_hand(current_elapsed)
self.time_var.set(self.format_time(current_elapsed))
# 50fps左右
self.root.after(20, self.update_loop)
if __name__ == "__main__":
root = tk.Tk()
app = StopwatchClock(root, size=420) # 可改尺寸
root.mainloop()
使用说明
安装:无需额外库,Python 自带 Tkinter(Windows/macOS 通常已有;若是最小化 Linux,需安装 python3-tk)。
运行:python stopwatch_clock.py
操作:
开始:计时开始或继续;
暂停:当前用时会被累积保存;
复位:清零并将秒针指回 12 点。
如果你想要增加分针(按 60 秒一圈推进)、圈次(Lap)记录,或者声音提示,告诉我你想要哪种,我直接在这份代码上加上去。