时钟?用Python?你可能会说,实在是太简单了吧,谁不会?
>>> 不,今天,我们要做的是圆盘时钟!
下载模块
使用pip下载所需模块:
pip install tkinter
一、导入模块
导入我们所需的模块:
import time
import math
from tkinter import *
二、定义指针
这里可以算是最核心、最难理解的部分了,使用一堆数学运算,定义出时钟的圆盘、刻度、数字和指针。(注:需要有对三角函数的深刻理解~)
def points():
for i in range(1, 13):
x = 200 + 120 * math.sin(2 * math.pi * i / 12)
y = 200 - 120 * math.cos(2 * math.pi * i / 12)
canvas.create_text(x, y, text=i, font=('黑体', 20), fill='Navy')
for i in range(1, 61):
if i % 5 == 0:
r = 150
else:
r = 145
x = 200 + 140 * math.sin(2 * math.pi * i / 60)
y = 200 - 140 * math.cos(2 * math.pi * i / 60)
x2 = 200 + r * math.sin(2 * math.pi * i / 60)
y2 = 200 - r * math.cos(2 * math.pi * i / 60)
canvas.create_line(x, y, x2, y2)
def createline(radius, line_width, rad):
x = 200 + radius * math.sin(rad)
y = 200 - radius * math.cos(rad)
i = canvas.create_line(200, 200, x, y, width=line_width, fill='black')
List.append(i)
三、生成窗口与初始化
生成tkinter窗口,并导入函数。
root = Tk()
root.title("轩氏时钟")
root.geometry("400x500")
canvas = Canvas(root, width=400, height=500)
canvas.pack()
canvas.create_oval(50, 50, 350, 350, fill='white')
canvas.create_image(195, 200)
List = []
points()
四、指针动态显示
通过简单的循环,实现对指针的动态显示。
while True:
try:
tm = time.localtime()
t_hour = 0
if tm.tm_hour <= 12:
t_hour = tm.tm_hour
else:
t_hour = tm.tm_hour - 12
rad1 = 2 * math.pi * (t_hour + tm.tm_min / 60) / 12
rad2 = 2 * math.pi * (tm.tm_min + tm.tm_sec / 60) / 60
rad3 = 2 * math.pi * tm.tm_sec / 60
createline(50, 6, rad1)
createline(90, 3, rad2)
createline(120, 1, rad3)
cur_time = time.strftime('%Y-%m-%d\n\n %X', time.localtime())
time_text = canvas.create_text(200, 420, text=cur_time, font=500)
root.update()
time.sleep(1)
for j in List:
canvas.delete(j)
canvas.delete(time_text)
except:
break
解释一下,以下部分是在时钟下方显示了数字时间:
cur_time = time.strftime('%Y-%m-%d\n\n %X', time.localtime())
time_text = canvas.create_text(200, 420, text=cur_time, font=500)
root.update()
time.sleep(1)
以下部分是对钟面的痕迹清除,否则会产生残影:
for j in List:
canvas.delete(j)
canvas.delete(time_text)
五、进入窗口循环
root.mainloop()
效果展示
至此,我们的圆盘时钟已经制作完成,效果如图:
还是比较美观的,当然,你也可以自行设置颜色与粗细等。
完整代码
完整代码如下:
def points():
for i in range(1, 13):
x = 200 + 120 * math.sin(2 * math.pi * i / 12)
y = 200 - 120 * math.cos(2 * math.pi * i / 12)
canvas.create_text(x, y, text=i, font=('黑体', 20), fill='Navy')
for i in range(1, 61):
if i % 5 == 0:
r = 150
else:
r = 145
x = 200 + 140 * math.sin(2 * math.pi * i / 60)
y = 200 - 140 * math.cos(2 * math.pi * i / 60)
x2 = 200 + r * math.sin(2 * math.pi * i / 60)
y2 = 200 - r * math.cos(2 * math.pi * i / 60)
canvas.create_line(x, y, x2, y2)
def createline(radius, line_width, rad):
x = 200 + radius * math.sin(rad)
y = 200 - radius * math.cos(rad)
i = canvas.create_line(200, 200, x, y, width=line_width, fill='black')
List.append(i)
root = Tk()
root.title("轩氏时钟")
root.geometry("400x500")
canvas = Canvas(root, width=400, height=500)
canvas.pack()
canvas.create_oval(50, 50, 350, 350, fill='white')
canvas.create_image(195, 200)
List = []
points()
while True:
try:
tm = time.localtime()
t_hour = 0
if tm.tm_hour <= 12:
t_hour = tm.tm_hour
else:
t_hour = tm.tm_hour - 12
rad1 = 2 * math.pi * (t_hour + tm.tm_min / 60) / 12
rad2 = 2 * math.pi * (tm.tm_min + tm.tm_sec / 60) / 60
rad3 = 2 * math.pi * tm.tm_sec / 60
createline(50, 6, rad1)
createline(90, 3, rad2)
createline(120, 1, rad3)
cur_time = time.strftime('%Y-%m-%d\n\n %X', time.localtime())
time_text = canvas.create_text(200, 420, text=cur_time, font=500)
root.update()
time.sleep(1)
for j in List:
canvas.delete(j)
canvas.delete(time_text)
except:
break
root.mainloop()