演示7:python钟表绘制

介绍

为学生演示而用,使用tkinter控件库实现。
其中使用time库控制绘制帧数,使用datetime获取相关时间数据,使用_thread来调用绘制函数。

基础功能:

  1. 秒针,每0.1秒跳动一次,每跳动一次旋转0.6度;
  2. 分针,每1秒跳动一次,每跳动一次旋转0.1度 ;
  3. 时针,每1秒跳动一次,每跳动一次旋转约0.0083度;

万年历月份功能:

  1. 指向当前月份的数字;

万年历日期功能:

  1. 指向当前日期的数字,部分数字用点代替;

万年历星期功能:

  1. 指向当前星期的英文缩写;

样品展示

模仿江诗丹顿的表盘

知识

  1. Canvas 画布,属于tkinter库,可以在上面绘制各类图形
    tk,必要填入的窗口变量,表示该画布是要绘制在某个控件上面;
    width,必要填写的画布宽度;
    height,必要填写的画布敢赌;
  2. place,设置画布左上角的显示位置,其他控件通用;
  3. create_oval,绘制圆
    (x1,y1,x2,y2),x1与y1是圆所属的矩形左上角坐标,x2与y2是圆所属的矩形右下角坐标
    width,圆的边宽度
    outline,圆的边颜色
    fill,圆中间填充的颜色
  4. create_polygon,绘制多边形
    (x1,y1,x2,y2,x3,y3,…),填写每一个折点的坐标
    其他同绘制圆
  5. 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()
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值