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 MySQLdb模块连接操作mysql数据库实例
Apr 08 Python
Python的Django框架中从url中捕捉文本的方法
Jul 20 Python
python编程使用协程并发的优缺点
Sep 20 Python
python3.5安装python3-tk详解
Apr 26 Python
使用python接入微信聊天机器人
Mar 31 Python
Python数据分析模块pandas用法详解
Sep 04 Python
Python定时发送天气预报邮件代码实例
Sep 09 Python
Python通过Manager方式实现多个无关联进程共享数据的实现
Nov 07 Python
Python Handler处理器和自定义Opener原理详解
Mar 05 Python
宝塔面板成功部署Django项目流程(图文)
Jun 22 Python
pytorch加载预训练模型与自己模型不匹配的解决方案
May 13 Python
pytorch 运行一段时间后出现GPU OOM的问题
Jun 02 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
Smarty foreach控制循环次数的一些方法
2015/07/01 PHP
PHP中Restful api 错误提示返回值实现思路
2016/04/12 PHP
使用php实现网站验证码功能【推荐】
2017/02/09 PHP
JS日历 推荐
2006/12/03 Javascript
javascript中的=等号个数问题两个跟三个有什么区别
2013/10/23 Javascript
jquery提交form表单简单示例分享
2014/03/03 Javascript
显示今天的日期js代码(阳历和农历)
2014/09/30 Javascript
JavaScript组合拼接字符串的效率对比测试
2014/11/06 Javascript
JavaScript中的原型链prototype介绍
2014/12/30 Javascript
jQuery Ajax调用WCF服务详细教程
2015/03/31 Javascript
JS实现点击按钮获取页面高度的方法
2015/11/02 Javascript
跟我学习javascript的全局变量
2015/11/16 Javascript
Angular中封装fancyBox(图片预览)遇到问题小结
2017/09/01 Javascript
Vue-router 类似Vuex实现组件化开发的示例
2017/09/15 Javascript
如何获取TypeScript的声明文件.d.ts
2018/05/01 Javascript
vue中element 上传功能的实现思路
2018/07/06 Javascript
JS实现的小火箭发射动画效果示例
2018/12/08 Javascript
react用Redux中央仓库实现一个todolist
2019/09/29 Javascript
Jquery 动态添加元素并添加点击事件实现过程解析
2019/10/12 jQuery
Python+OpenCV让电脑帮你玩微信跳一跳
2018/01/04 Python
TensorFlow 模型载入方法汇总(小结)
2018/06/19 Python
解决PySide+Python子线程更新UI线程的问题
2019/01/11 Python
python实现列表中最大最小值输出的示例
2019/07/09 Python
Python基于WordCloud制作词云图
2019/11/29 Python
Python3 main函数使用sys.argv传入多个参数的实现
2019/12/25 Python
耐克波兰官方网站:Nike波兰
2019/09/03 全球购物
武汉英思工程科技有限公司–ORACLE面试测试题目
2012/04/30 面试题
说出你对remoting 和webservice的理解和应用
2014/06/08 面试题
酒店端午节活动方案
2014/08/26 职场文书
2015届本科毕业生自我鉴定
2014/09/27 职场文书
副检察长四风问题对照检查材料思想汇报
2014/10/07 职场文书
2014年教育教学工作总结
2014/11/13 职场文书
2015年女生节活动总结
2015/02/27 职场文书
2015年安全工作总结范文
2015/04/02 职场文书
简历中的自我评价应该这样写!
2019/07/12 职场文书
一文搞懂PHP中的抽象类和接口
2022/05/25 PHP