栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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-%dnn %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-%dnn %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-%dnn %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()

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1011741.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号