1. 项目概述
我们将用 tkinter
绘制一个包含以下功能的动态时钟:
- 表盘:展示 12 个小时数字和 60 个刻度。
- 指针:实时显示当前时间的时针、分针和秒针。
- 动态更新:每秒刷新一次,确保指针与实际时间同步。
2. 代码实现
以下是完整代码:
import tkinter as tk
from math import pi, sin, cos
from time import localtime
def update_clock():
now = localtime()
hour = now.tm_hour % 12
minute = now.tm_min
second = now.tm_sec
# 清除之前绘制的指针
canvas.delete("handles")
# 绘制时针
hour_angle = (hour * 30 + minute * 0.5 + second * 0.00833) * pi / 180
hour_x = center_x + int(length_hour * sin(hour_angle))
hour_y = center_y - int(length_hour * cos(hour_angle))
canvas.create_line(center_x, center_y, hour_x, hour_y, width=6, tags="handles")
# 绘制分针
minute_angle = (minute * 6 + second * 0.1) * pi / 180
minute_x = center_x + int(length_minute * sin(minute_angle))
minute_y = center_y - int(length_minute * cos(minute_angle))
canvas.create_line(center_x, center_y, minute_x, minute_y, width=4, tags="handles")
# 绘制秒针
second_angle = second * 6 * pi / 180
second_x = center_x + int(length_second * sin(second_angle))
second_y = center_y - int(length_second * cos(second_angle))
canvas.create_line(center_x, center_y, second_x, second_y, width=2, fill="red", tags="handles")
# 每隔1秒更新一次
canvas.after(1000, update_clock)
# 创建主窗口
root = tk.Tk()
root.title("时钟")
# 画布尺寸
width = 400
height = 400
center_x = width // 2
center_y = height // 2
# 指针长度
length_hour = 100
length_minute = 130
length_second = 150
# 创建画布
canvas = tk.Canvas(root, width=width, height=height, bg="ivory")
canvas.pack()
# 绘制表盘
for i in range(12):
angle = (i + 1) * 30 * pi / 180
x = center_x + int(120 * sin(angle))
y = center_y - int(120 * cos(angle))
canvas.create_text(x, y, text=str(i + 1), font=("Times New Roman", 24))
# 绘制刻度
for i in range(60):
angle = i * 6 * pi / 180
x1 = center_x + int(135 * sin(angle))
y1 = center_y - int(135 * cos(angle))
x2 = center_x + int(141 * sin(angle))
y2 = center_y - int(141 * cos(angle))
width = 2 if i % 5 == 0 else 1
canvas.create_line(x1, y1, x2, y2, width=width)
# 绘制中心圆点
canvas.create_oval(center_x - 10, center_y - 10, center_x + 10, center_y + 10, fill="black")
# 启动时钟更新
update_clock()
# 进入主事件循环
root.mainloop()
3. 代码讲解
(1) 主窗口的创建
root = tk.Tk()
root.title("时钟")
我们通过 tk.Tk()
创建了一个主窗口,并为窗口命名为“时钟”。
(2) 绘制画布
canvas = tk.Canvas(root, width=400, height=400, bg="ivory")
canvas.pack()
通过 Canvas
在窗口上创建一个绘图区域,设置背景颜色为“象牙白”。
(3) 绘制表盘
绘制小时数字:
for i in range(12):
angle = (i + 1) * 30 * pi / 180
x = center_x + int(120 * sin(angle))
y = center_y - int(120 * cos(angle))
canvas.create_text(x, y, text=str(i + 1), font=("Times New Roman", 24))
这段代码计算每个小时数字的位置,使用三角函数将其分布在表盘上。
绘制刻度:
for i in range(60):
angle = i * 6 * pi / 180
x1 = center_x + int(135 * sin(angle))
y1 = center_y - int(135 * cos(angle))
x2 = center_x + int(141 * sin(angle))
y2 = center_y - int(141 * cos(angle))
width = 2 if i % 5 == 0 else 1
canvas.create_line(x1, y1, x2, y2, width=width)
通过遍历 60 个刻度,区分每 5 分钟的长刻度和普通刻度。
(4) 动态指针绘制
时针、分针和秒针:
通过以下代码绘制指针,注意角度的计算公式:
hour_angle = (hour * 30 + minute * 0.5 + second * 0.00833) * pi / 180
hour_x = center_x + int(length_hour * sin(hour_angle))
hour_y = center_y - int(length_hour * cos(hour_angle))
canvas.create_line(center_x, center_y, hour_x, hour_y, width=6, tags="handles")
每个指针的角度取决于当前时间,使用 sin
和 cos
计算其端点坐标。
(5) 动态更新
canvas.after(1000, update_clock)
通过 after
方法设置定时器,每隔 1 秒重新调用 update_clock
函数,实现指针的动态更新。
4. 总结
在这个项目中,我们学习了以下内容:
tkinter
的基本组件使用。Canvas
画布的绘图方法。- 如何使用数学函数计算表盘和指针位置。
- 使用
after
方法实现动态更新。