介绍
为学生演示而用,使用tkinter控件库实现。
其中使用time库控制绘制帧数,使用datetime获取相关时间数据,使用_thread来调用绘制函数。
基础功能:
- 秒针,每0.1秒跳动一次,每跳动一次旋转0.6度;
- 分针,每1秒跳动一次,每跳动一次旋转0.1度 ;
- 时针,每1秒跳动一次,每跳动一次旋转约0.0083度;
万年历月份功能:
- 指向当前月份的数字;
万年历日期功能:
- 指向当前日期的数字,部分数字用点代替;
万年历星期功能:
- 指向当前星期的英文缩写;
样品展示
知识
- Canvas 画布,属于tkinter库,可以在上面绘制各类图形
tk,必要填入的窗口变量,表示该画布是要绘制在某个控件上面;
width,必要填写的画布宽度;
height,必要填写的画布敢赌; - place,设置画布左上角的显示位置,其他控件通用;
- create_oval,绘制圆
(x1,y1,x2,y2),x1与y1是圆所属的矩形左上角坐标,x2与y2是圆所属的矩形右下角坐标
width,圆的边宽度
outline,圆的边颜色
fill,圆中间填充的颜色 - create_polygon,绘制多边形
(x1,y1,x2,y2,x3,y3,…),填写每一个折点的坐标
其他同绘制圆 - create_text,绘制文字
(x,y),文字绘制的位置
font,文字的字体与文字大小
源码
from tkinter import *
from time import *
from math import *
from datetime import datetime as da
import _thread as th
tk=Tk()
#窗口尺寸
tk.minsize(400,400)
tk.maxsize(400,400)
tk.title('仿江诗丹顿')
#画布
ca=Canvas(tk,width=400,height=400)
ca.place(x=0,y=0)#设置画布位置
def draw():
ca.delete('all')#清空画布
ca.create_oval((10,10,390,390),fill='#f9f9f9')
ca.create_oval((20,20,380,380),width=6,outline='#777777')
ca.create_oval((10,10,390,390),width=16,outline='#aaaaaa')
#表盘文字
ca.create_text((200,130),text='VACHERON CONSTANTIN',font=('Tahoma',10))
ca.create_text((200,150),text='GENEVE',font=('Tahoma',10))
#图标
ca.create_polygon((200,92,210,87,190,117,200,112,210,117,190,87,200,92),fill='#ffeebb',outline='#ffeebb')
ca.create_polygon((190,102,185,112,215,92,210,102,215,112,185,92,190,102),fill='#ffeebb',outline='#ffeebb')
#圆点
for i in range(60):
if i%5!=0:
ca.create_oval((196+cos(i*pi/30)*160,196-sin(i*pi/30)*160,204+cos(i*pi/30)*160,204-sin(i*pi/30)*160),fill='#ffeebb',outline='#ffffff')
#长条
for i in range(12):
#if i%3!=0:
ca.create_polygon((200+cos(i*pi/6-0.009)*170,200-sin(i*pi/6-0.009)*170,200+cos(i*pi/6+0.009)*170,200-sin(i*pi/6+0.009)*170,\
200+cos(i*pi/6+0.009)*135,200-sin(i*pi/6+0.009)*135,200+cos(i*pi/6-0.009)*135,200-sin(i*pi/6-0.009)*135),fill='#ffeebb',outline='#ffeebb')
#12点图案
ca.create_polygon((200,28,205,33,200,36,195,33,200,28),fill='#ffeebb')
ca.create_polygon((200,36,205,33,203,69,200,70,200,36),fill='#f1e0ad')
ca.create_polygon((200,36,195,33,197,69,200,70,200,36),fill='#eadaaa')
#6点图案
ca.create_polygon((200,372,205,367,200,364,195,367,200,372),fill='#ffeebb')
ca.create_polygon((200,364,205,367,203,331,200,330,200,364),fill='#eadaaa')
ca.create_polygon((200,364,195,367,197,331,200,330,200,364),fill='#f1e0ad')
#9点图案
ca.create_polygon((28,200,33,205,36,200,33,195,28,200),fill='#ffeebb')
ca.create_polygon((36,200,33,205,69,203,70,200,36,200),fill='#f1e0ad')
ca.create_polygon((36,200,33,195,69,197,70,200,36,200),fill='#eadaaa')
#3点图案
ca.create_polygon((372,200,367,205,364,200,367,195,372,200),fill='#ffeebb')
ca.create_polygon((364,200,367,205,331,203,330,200,364,200),fill='#eadaaa')
ca.create_polygon((364,200,367,195,331,197,330,200,364,200),fill='#f1e0ad')
#中心圈
ca.create_oval((188,188,212,212),fill='#eedd99',outline='#eedd99')
#星期
ca.create_oval((160,230,240,310),outline='#eeeeee',fill='#fefefe')
ca.create_text((200+cos(pi/3.5*2)*30,270-sin(pi/3.5*2)*30),text='SUN',font=('Tahoma',6),fill='#888888')
ca.create_text((200+cos(pi/3.5)*30,270-sin(pi/3.5)*30),text='MON',font=('Tahoma',6),fill='#888888')
ca.create_text((200+cos(pi/3.5*7)*30,270-sin(pi/3.5*7)*30),text='TUE',font=('Tahoma',6),fill='#888888')
ca.create_text((200+cos(pi/3.5*6)*30,270-sin(pi/3.5*6)*30),text='WED',font=('Tahoma',6),fill='#888888')
ca.create_text((200+cos(pi/3.5*5)*30,270-sin(pi/3.5*5)*30),text='THU',font=('Tahoma',6),fill='#888888')
ca.create_text((200+cos(pi/3.5*4)*30,270-sin(pi/3.5*4)*30),text='FRI',font=('Tahoma',6),fill='#888888')
ca.create_text((200+cos(pi/3.5*3)*30,270-sin(pi/3.5*3)*30),text='SAT',font=('Tahoma',6),fill='#888888')
ca.create_oval((195,265,205,275),fill='#cccccc',outline='#cccccc')
#月
ca.create_oval((90,170,170,250),outline='#eeeeee',fill='#fefefe')
for i in range(12):
ca.create_text((130+cos(pi/6*(i+1)-pi/2)*32,210+sin(pi/6*(i+1)-pi/2)*32),text=str(i+1),font=('Tahoma',6),fill='#888888')
ca.create_oval((125,205,135,215),fill='#cccccc',outline='#cccccc')
#日
ca.create_oval((230,170,310,250),outline='#eeeeee',fill='#fefefe')
for i in range(31):
if i%2==1 and i!=31:
ca.create_text((270+cos(pi/15.5*(i+1)-pi/2)*33,210+sin(pi/15.5*(i+1)-pi/2)*33),text=str(i+1),font=('Tahoma',4),fill='#888888')
else:
ca.create_oval((269+cos(pi/15.5*(i+1)-pi/2)*32,209+sin(pi/15.5*(i+1)-pi/2)*32,\
271+cos(pi/15.5*(i+1)-pi/2)*32,211+sin(pi/15.5*(i+1)-pi/2)*32),outline="#888888",fill='#888888')
ca.create_oval((265,205,275,215),fill='#cccccc',outline='#cccccc')
def draw2():
#时间数据
ti=localtime(time())
#各指针角度
sec=(ti[5]+time()%1)*pi/30-pi/2
minn=(ti[4]+ti[5]/60)*pi/30-pi/2
hou=(ti[3]+(ti[4]*60+ti[5])/3600)*pi/6-pi/2
week=(-1+da.now().weekday())*(pi/3.5)
mon=(ti[1]-3)*(pi/6)
day=(ti[2]-8)*(pi/15.5)
#周(星期几)针绘制
we=ca.create_polygon((200+cos(week)*25,270+sin(week)*25,\
200+cos(week+0.08)*20,270+sin(week+0.08)*20,\
200+cos(week+0.15)*6,270+sin(week+0.15)*6,\
200+cos(week-0.15)*6,270+sin(week-0.15)*6,\
200+cos(week-0.08)*20,270+sin(week-0.08)*20),fill='#cccccc',outline='#cccccc')
wq=ca.create_oval((198,268,202,272),fill='#999999',outline='#999999')
#月针绘制
mo=ca.create_polygon((130+cos(mon)*25,210+sin(mon)*25,\
130+cos(mon+0.08)*20,210+sin(mon+0.08)*20,\
130+cos(mon+0.15)*6,210+sin(mon+0.15)*6,\
130+cos(mon-0.15)*6,210+sin(mon-0.15)*6,\
130+cos(mon-0.08)*20,210+sin(mon-0.08)*20),fill='#cccccc',outline='#cccccc')
ww=ca.create_oval((128,208,132,212),fill='#999999',outline='#999999')
#日针绘制
dy=ca.create_polygon((270+cos(day)*25,210+sin(day)*25,\
270+cos(day+0.08)*20,210+sin(day+0.08)*20,\
270+cos(day+0.15)*6,210+sin(day+0.15)*6,\
270+cos(day-0.15)*6,210+sin(day-0.15)*6,\
270+cos(day-0.08)*20,210+sin(day-0.08)*20),fill='#cccccc',outline='#cccccc')
wr=ca.create_oval((268,208,272,212),fill='#999999',outline='#999999')
#时针绘制
ho=ca.create_polygon((200+cos(hou)*110,200+sin(hou)*110,\
200+cos(hou+0.04)*90,200+sin(hou+0.04)*90,\
200+cos(hou+0.15)*10,200+sin(hou+0.15)*10,\
200+cos(hou-0.15)*10,200+sin(hou-0.15)*10,\
200+cos(hou-0.04)*90,200+sin(hou-0.04)*90),fill='#eedd99',outline='#eedd99')
#分针绘制
mi=ca.create_polygon((200+cos(minn)*110,200+sin(minn)*130,\
200+cos(minn+0.025)*90,200+sin(minn+0.025)*110,\
200+cos(minn+0.1)*10,200+sin(minn+0.1)*10,\
200+cos(minn-0.1)*10,200+sin(minn-0.1)*10,\
200+cos(minn-0.025)*90,200+sin(minn-0.025)*110),fill='#eedd99',outline='#eedd99')
#秒针绘制
se=ca.create_polygon((200+cos(sec)*150,200+sin(sec)*150,\
200+cos(sec+0.003)*140,200+sin(sec+0.003)*140,\
200+cos(sec+0.003)*(-50),200+sin(sec+0.003)*(-50),\
200+cos(sec-0.003)*(-50),200+sin(sec-0.003)*(-50),\
200+cos(sec-0.003)*140,200+sin(sec-0.003)*140),fill='#eedd99',outline='#eedd99')
qw=ca.create_oval((198,198,202,202),fill='#888888',outline='#888888')
sleep(0.1)#休眠0.1秒
#删除各指针
ca.delete(we)
ca.delete(wq)
ca.delete(se)
ca.delete(mi)
ca.delete(ho)
ca.delete(qw)
ca.delete(mo)
ca.delete(ww)
ca.delete(dy)
ca.delete(wr)
th.start_new_thread(draw2,())
draw()
th.start_new_thread(draw2,())
mainloop()