Python canvas:简易圆盘时钟,圆盘

时钟?用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()

  • 8
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值