Python Tkinter模块实现时钟功能应用示例


Posted in Python onJuly 23, 2018

本文实例讲述了Python Tkinter模块实现时钟功能。分享给大家供大家参考,具体如下:

本机测试效果:

Python Tkinter模块实现时钟功能应用示例

完整代码:

# coding=utf-8
from Tkinter import *
import _tkinter
import math
import time
from threading import Thread
class Clock:
  def __init__(self, master, x, y, width, height, radius):
    '''
    :param master: 父窗口
    :param x: 时钟中心点的x坐标
    :param y: 时钟中心点的y坐标
    :param width: 画布的宽度
    :param height: 画布的高度
    :param radius: 时钟钟盘的半径
    '''
    self.centerX = x
    self.centerY = y
    self.radius = radius
    self.canvas = Canvas(master, width=width, height=height) # 画布
    self.canvas.pack()
    self.canvas.create_oval(
      x - radius,
      y - radius,
      x + radius,
      y + radius) # 画钟框
    self.id_lists = []
    self.hourHandRadius = self.radius * 1.0 / 4  # 指针长度
    self.minHandRadius = self.radius * 2.0 / 3  # 分针长度
    self.secHandRadius = self.radius * 4.0 / 5  # 秒针长度
    self.timeVar = StringVar()
    # self.timeVar.set('')
    self.timeLabel = Label(self.canvas.master, textvariable=self.timeVar)
    self.timeLabel.pack(side=BOTTOM)
    #self.canvas.master.protocol('WM_DELETE_WINDOW', self.canvas.master.destroy)
  def __del__(self):
    self._deleteItems(self.id_lists)
  # 绘制时钟钟盘
  def drawClockDial(self):
    # 绘制钟盘上的数字1-12
    r = self.radius - 15
    for i in range(1, 13):
      rad = 2 * math.pi / 12 * i
      x = self.centerX + math.sin(rad) * r
      y = self.centerY - math.cos(rad) * r
      id = self.canvas.create_text(x, y, text=str(i))
      self.id_lists.append(id)
    # 绘制钟盘上的刻度
    r1 = self.radius - 5
    r2 = self.radius
    for i in range(1, 61):
      rad = 2 * math.pi / 60 * i
      x1, y1 = self._getPosByRadAndRadius(rad, r1)
      x2, y2 = self._getPosByRadAndRadius(rad, r2)
      id = self.canvas.create_line(x1, y1, x2, y2)
      self.id_lists.append(id)
  # 显示时间
  def showTime(self, tm):
    hour = tm.tm_hour % 12
    min = tm.tm_min
    sec = tm.tm_sec
    sec_rad = 2 * math.pi / 60 * sec
    min_rad = 2 * math.pi / 60 * (min + sec / 60.0)
    hour_rad = 2 * math.pi / 12 * (hour + min / 60.0)
    timeStr = '当前时间: %d-%02d-%02d %02d:%02d:%02d' % (
      tm.tm_year, tm.tm_mon, tm.tm_mday, hour, min, sec)
    self.timeVar.set(timeStr)
    hour_id = self._drawLine(hour_rad, self.hourHandRadius, 6)
    min_id = self._drawLine(min_rad, self.minHandRadius, 4)
    sec_id = self._drawLine(sec_rad, self.secHandRadius, 3)
    return (hour_id, min_id, sec_id)
  def run(self):
    def _run():
      while True:
        tm = time.localtime()
        id_lists = self.showTime(tm)
        self.canvas.master.update()
        time.sleep(1)
        self._deleteItems(id_lists)
    thrd = Thread(target=_run) # 创建新的线程
    thrd.run() # 启动线程
  def _drawLine(self, rad, radius, width):
    x, y = self._getPosByRadAndRadius(rad, radius)
    id = self.canvas.create_line(
      self.centerX, self.centerY, x, y, width=width)
    return id
  def _getPosByRadAndRadius(self, rad, radius):
    x = self.centerX + radius * math.sin(rad)
    y = self.centerY - radius * math.cos(rad)
    return (x, y)
  def _deleteItems(self, id_lists):
    for id in id_lists:
      try:
        self.canvas.delete(id)
      except BaseException:
        pass
if __name__ == '__main__':
  root = Tk()
  root.title('3water.com 时钟')
  clock = Clock(root, 200, 200, 400, 400, 150)
  clock.drawClockDial()
  clock.run()
  root.mainloop()

待解决的bug:

关闭程序的时候,会出现如下的错误:

Python Tkinter模块实现时钟功能应用示例

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
学习python (2)
Oct 31 Python
Python脚本获取操作系统版本信息
Dec 17 Python
用TensorFlow实现多类支持向量机的示例代码
Apr 28 Python
Windows 64位下python3安装nltk模块
Sep 19 Python
python 多线程将大文件分开下载后在合并的实例
Nov 09 Python
Python中的枚举类型示例介绍
Jan 09 Python
Python学习笔记之读取文件、OS模块、异常处理、with as语法示例
Jun 04 Python
python多线程实现TCP服务端
Sep 03 Python
Django框架 Pagination分页实现代码实例
Sep 04 Python
关于tf.TFRecordReader()函数的用法解析
Feb 17 Python
基于python爬取链家二手房信息代码示例
Oct 21 Python
Django url 路由匹配过程详解
Jan 22 Python
python定向爬虫校园论坛帖子信息
Jul 23 #Python
python实现图片批量压缩程序
Jul 23 #Python
python中的插值 scipy-interp的实现代码
Jul 23 #Python
Flask框架URL管理操作示例【基于@app.route】
Jul 23 #Python
python中的turtle库函数简单使用教程
Jul 23 #Python
Flask框架配置与调试操作示例
Jul 23 #Python
python实现时间o(1)的最小栈的实例代码
Jul 23 #Python
You might like
pw的一个放后门的方法分析
2007/10/08 PHP
PHP7.1方括号数组符号多值复制及指定键值赋值用法分析
2016/09/26 PHP
PHP查询大量数据内存耗尽问题的解决方法
2016/10/28 PHP
PHP验证类的封装与使用方法详解
2019/01/10 PHP
11款基于Javascript的文件管理器
2009/10/25 Javascript
Javascript 面向对象 继承
2010/05/13 Javascript
jquery load()在firefox(火狐)下显示不正常的解决方法
2011/04/05 Javascript
另一个javascript小测验(代码集合)
2011/07/27 Javascript
jquery zTree异步加载简单实例分享
2013/02/05 Javascript
jQuery中change事件用法实例
2014/12/26 Javascript
JavaScript实现的双向跨域插件分享
2015/01/31 Javascript
jquery控制背景音乐开关与自动播放提示音的方法
2015/02/06 Javascript
jQuery实现3D文字特效的方法
2015/03/10 Javascript
原生js获取iframe中dom元素--父子页面相互获取对方dom元素的方法
2016/08/05 Javascript
Angular 应用技巧总结
2016/09/14 Javascript
easyUI combobox实现联动效果
2017/01/17 Javascript
基于JavaScript实现报警器提示音效果
2017/10/27 Javascript
使用vue-router为每个路由配置各自的title
2018/07/30 Javascript
使用electron将vue-cli项目打包成exe的方法
2018/09/29 Javascript
js实现通过开始结束控制的计时器
2019/02/25 Javascript
vue 判断元素内容是否超过宽度的方式
2020/07/29 Javascript
node中短信api实现验证码登录的示例代码
2021/01/20 Javascript
[04:36]DOTA2国际邀请赛 ti3精彩集锦
2013/08/19 DOTA
[02:16]卖萌的僵尸 DOTA2神话信使飞僵小宝来袭
2014/03/24 DOTA
[02:22]《新闻直播间》2017年08月14日
2017/08/15 DOTA
Python中变量交换的例子
2014/08/25 Python
浅谈Python单向链表的实现
2015/12/24 Python
Python3.6安装及引入Requests库的实现方法
2018/01/24 Python
Python中多个数组行合并及列合并的方法总结
2018/04/12 Python
Python实用工具FuckIt.py介绍
2019/07/02 Python
Python中变量的输入输出实例代码详解
2019/07/28 Python
如何使用python写截屏小工具
2020/09/29 Python
JavaScript获取当前url根目录(路径)
2014/02/19 面试题
门卫工作岗位职责
2013/12/17 职场文书
白酒代理协议书范本
2014/10/26 职场文书
2016高校自主招生自荐信范文
2016/01/28 职场文书