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使用Supervisor来管理进程的方法
May 28 Python
Python进程间通信用法实例
Jun 04 Python
在Lighttpd服务器中运行Django应用的方法
Jul 22 Python
python实现识别相似图片小结
Feb 22 Python
Python编程实现删除VC临时文件及Debug目录的方法
Mar 22 Python
python3中dict(字典)的使用方法示例
Mar 22 Python
用Pygal绘制直方图代码示例
Dec 07 Python
使用TensorFlow实现二分类的方法示例
Feb 05 Python
Python 多线程搜索txt文件的内容,并写入搜到的内容(Lock)方法
Aug 23 Python
python retrying模块的使用方法详解
Sep 25 Python
python 读取更新中的log 或其它文本方式
Dec 24 Python
Python实战之实现康威生命游戏
Apr 26 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
在Windows XP下安装Apache+MySQL+PHP环境
2015/02/22 PHP
php实现等比例不失真缩放上传图片的方法
2016/11/14 PHP
PHP面向对象之里氏替换原则简单示例
2018/04/08 PHP
PHP使用标准库spl实现的观察者模式示例
2018/08/04 PHP
分享8个Laravel模型时间戳使用技巧小结
2020/02/12 PHP
汉化英文版的Dreamweaver CS5并自动提示jquery
2010/11/25 Javascript
新浪微博字数统计 textarea字数统计实现代码
2011/08/28 Javascript
jQuery让控件左右移动的三种实现方法
2013/09/08 Javascript
从零学jquery之如何使用回调函数
2014/05/16 Javascript
jQuery解决input元素的blur事件和其他非表单元素的click事件冲突问题
2016/08/15 Javascript
javascript 动态脚本添加的简单方法
2016/10/11 Javascript
JavaScript中String对象的方法介绍
2017/01/04 Javascript
JavaScript中数组Array.sort()排序方法详解
2017/03/01 Javascript
如何通过非数字与字符的方式实现PHP WebShell详解
2017/07/02 Javascript
关于前后端json数据的发送与接收详解
2017/07/30 Javascript
react-navigation 如何判断用户是否登录跳转到登录页的方法
2017/12/01 Javascript
vue中v-for通过动态绑定class实现触发效果
2018/12/06 Javascript
使用 Vue cli 3.0 构建自定义组件库的方法
2019/04/30 Javascript
vue 强制组件重新渲染(重置)的两种方案
2019/10/29 Javascript
js实现圆形显示鼠标单击位置
2020/02/11 Javascript
python文件操作相关知识点总结整理
2016/02/22 Python
Python利用字典将两个通讯录文本合并为一个文本实例
2018/01/16 Python
python针对不定分隔符切割提取字符串的方法
2018/10/26 Python
python制作图片缩略图
2019/04/30 Python
python利用多种方式来统计词频(单词个数)
2019/05/27 Python
python 随机生成10位数密码的实现代码
2019/06/27 Python
Django中create和save方法的不同
2019/08/13 Python
什么是Python中的顺序表
2020/06/02 Python
Python+Opencv身份证号码区域提取及识别实现
2020/08/25 Python
python 元组和列表的区别
2020/12/30 Python
5分钟快速掌握Python定时任务框架的实现
2021/01/26 Python
python matplotlib工具栏源码探析二之添加、删除内置工具项的案例
2021/02/25 Python
CSS3中Transform动画属性用法详解
2016/07/04 HTML / CSS
用HTML5.0制作网页的教程
2010/05/30 HTML / CSS
老干部工作先进集体事迹材料
2014/05/21 职场文书
党员思想汇报材料
2014/12/19 职场文书