• Tkinter 实现小闹钟


    今天女朋友家里买了一块很好看的挂钟,图案是驯鹿的,于是我就也突发奇想,打算用tkinter做一个类似的电子时钟。

    主要用到的方法就是canvas画布的图形绘制、删除与刷新,绘制时需要利用圆的性质计算出表盘数字、刻度的位置。

    具体的实现并不难,参考代码和注释吧:

    from tkinter import *
    import math,time
    from PIL import Image, ImageTk
    
    #定义时针上的刻度1~12
    def points():
        #绘制表盘数字
        for i in range(1,13): 
            #表盘中心的位置是200,200,由此计算刻度的位置
            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=('黑体',18),fill='Navy')  #颜色是海军蓝
        #绘制表盘刻度
        for i in range(1,61): #定义时针刻度(1~12h)
            if i%5==0:  #5的倍数要长一些
                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') 
    #绘制表盘中央的驯鹿图片
    path1="timg.jpg" 
    load = Image.open(path1)
    render = ImageTk.PhotoImage(load)
    canvas.create_image(195,200,image = render) #这个位置是自己调的
    List = [] #用来记录绘制的图形编号
    
    points() 
    
    #定义循环
    while True:
        try:
            tm=time.localtime() #获取当前时间       
            t_hour=0
            #转换成12小时制
            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=10,fill='purple')
            root.update() 
            time.sleep(1) #每秒刷新一次
            #删除画布上的之前绘制的图形,否则有残影
            for j in List:
                canvas.delete(j)
            canvas.delete(time_text)
        except:
            break
    
    root.mainloop()
    

      感觉来试一试最终成果。

  • 相关阅读:
    AT24C0X I2C通信原理
    Windows文件夹、文件源代码对比工具--WinMerge
    SignalTap导致PCIe Read/Write卡死
    Windows CMD 支持ls命令
    何为内存模型(JMM)?
    何为内存重排序?
    何为安全发布,又何为安全初始化?
    Hibernate入门之many to many关系映射详解
    Hibernate入门之one to many关系映射详解
    Hibernate入门之one to one关系映射详解
  • 原文地址:https://www.cnblogs.com/Skypeduty1225/p/16259330.html
Copyright © 2020-2023  润新知