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之??碌某?? target=
Sep 12 Python
Python列表(list)常用操作方法小结
Feb 02 Python
python2.7的编码问题与解决方法
Oct 04 Python
详解如何使用Python编写vim插件
Nov 28 Python
python  创建一个保留重复值的列表的补码
Oct 15 Python
搭建python django虚拟环境完整步骤详解
Jul 08 Python
详解python中的index函数用法
Aug 06 Python
Python三元运算与lambda表达式实例解析
Nov 30 Python
通过实例了解Python str()和repr()的区别
Jan 17 Python
Python3连接Mysql8.0遇到的问题及处理步骤
Feb 17 Python
python dir函数快速掌握用法技巧
Dec 09 Python
一文带你掌握Pyecharts地理数据可视化的方法
Feb 06 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
PHP静态调用非静态方法的应用分析
2013/05/02 PHP
php获取本周星期一具体日期的方法
2015/04/20 PHP
php gd等比例缩放压缩图片函数
2016/06/12 PHP
php实现生成PDF文件的方法示例【基于FPDF类库】
2018/07/21 PHP
php使用array_chunk函数将一个数组分割成多个数组
2018/12/05 PHP
JQuery 浮动导航栏实现代码
2009/08/27 Javascript
javascript:;与javascript:void(0)使用介绍
2013/06/05 Javascript
jQuery消息提示框插件Tipso
2015/05/04 Javascript
js判断文本框输入的内容是否为数字
2015/12/23 Javascript
JavaScript中获取纯正的undefined的方法
2016/03/06 Javascript
Jquery表单验证失败后不提交的解决方法
2016/10/18 Javascript
利用vue实现模态框组件
2016/12/19 Javascript
js实现截图保存图片功能的代码示例
2017/02/16 Javascript
如何理解jQuery中的ajaxSubmit方法
2017/03/13 Javascript
React组件之间的通信的实例代码
2017/06/27 Javascript
详解JS数组Reduce()方法详解及高级技巧
2017/08/18 Javascript
如何让你的JS代码更好看易读
2017/12/01 Javascript
layui 优化button按钮和弹出框的方法
2018/08/15 Javascript
jQuery解析json格式数据示例
2018/09/01 jQuery
layui table 列宽百分比显示的实现方法
2019/09/28 Javascript
详解vue 自定义组件使用v-model 及探究其中原理
2019/10/11 Javascript
Node.js操作MongoDB数据库实例分析
2020/01/19 Javascript
Element Alert警告的具体使用方法
2020/07/27 Javascript
[05:15]2018年度CS GO社区贡献奖-完美盛典
2018/12/16 DOTA
Python基于matplotlib实现绘制三维图形功能示例
2018/01/18 Python
Python面向对象类继承和组合实例分析
2018/05/28 Python
Django Rest framework之认证的实现代码
2018/12/17 Python
浅析Python与Mongodb数据库之间的操作方法
2019/07/01 Python
Django 简单实现分页与搜索功能的示例代码
2019/11/07 Python
Python递归求出列表(包括列表中的子列表)的最大值实例
2020/02/27 Python
日本最大的眼镜购物网站:Oh My Glasses
2016/11/13 全球购物
工程师岗位职责
2013/11/08 职场文书
自行车广告词大全
2014/03/21 职场文书
研究生考核个人自我鉴定
2014/03/27 职场文书
司机岗位职责说明书
2014/07/29 职场文书
给老婆道歉的话
2015/01/20 职场文书