Python 桌面时钟

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 方法实现动态更新。
### 使用 Python 创建桌面时钟 #### 方法一:基于命令行的时间显示 对于简单的应用,可以先尝试在控制台打印当前时间。这有助于理解基本的时间处理方法。 ```python import datetime def show_time(): current_time = datetime.datetime.now().strftime("%H:%M:%S") # 获取格式化后的当前时间字符串 print(f"The current time is {current_time}") # 打印时间[^1] show_time() ``` 这段代码展示了如何获取并展示系统当前时间。通过`datetime`模块中的`now()`函数获得当前日期时间对象,并利用`strftime()`将其转换为易于阅读的形式。 #### 方法二:构建 Windows 服务形式的时钟 为了使应用程序能够在后台持续运行而不受用户登录状态的影响,可考虑将其构建成Windows服务。为此需借助第三方库如 `py2exe` 和 `Python Win32 Extensions` 来实现这一目标[^2]。 完成上述软件包的安装之后,可以根据官方给出的例子文件路径 `{PythonRoot}\Lib\site-packages\py2exe\samples\advanced\MyService.py` 进行学习模仿,从而创建自己的定时任务类继承自 `win32serviceutil.ServiceFramework` ,重写其中的方法以适应具体需求。 #### 方法三:采用 Kivy 构建图形界面版桌面时钟 如果希望拥有更加友好的用户体验,则推荐使用专门用于GUI编程的框架——Kivy来设计一款可视化的桌面时钟程序[^3]。 下面是一个简单例子: ```python from kivy.app import App from kivy.uix.label import Label from kivy.clock import Clock import datetime class TimeApp(App): def update_clock(self, *args): self.time_label.text = datetime.datetime.now().strftime('%H:%M:%S') def build(self): self.time_label = Label(text="00:00:00", font_size='80sp') Clock.schedule_interval(self.update_clock, 1) # 每隔一秒更新一次标签上的时间 return self.time_label if __name__ == '__main__': TimeApp().run() ``` 此段脚本定义了一个名为 `TimeApp` 的类,它继承自 `kivy.app.App`. 在初始化过程中设置好初始时间和字体大小;接着调用 `Clock.schedule_interval()` 函数安排每秒钟刷新一次界面上的文字内容,直到关闭窗口为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值