今天女朋友家里買了一塊很好看的掛鐘,圖案是馴鹿的,于是我就也突發奇想,打算用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()

  感覺來試一試最終成果。