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的几种标准输出重定向方式
Aug 15 Python
python+mongodb数据抓取详细介绍
Oct 25 Python
Python模糊查询本地文件夹去除文件后缀的实例(7行代码)
Nov 09 Python
python3获取两个日期之间所有日期,以及比较大小的实例
Apr 08 Python
从django的中间件直接返回请求的方法
May 30 Python
python读取LMDB中图像的方法
Jul 02 Python
10招!看骨灰级Pythoner玩转Python的方法
Apr 15 Python
python识别文字(基于tesseract)代码实例
Aug 24 Python
python 用户交互输入input的4种用法详解
Sep 24 Python
Tensorflow中k.gradients()和tf.stop_gradient()用法说明
Jun 10 Python
python实现简单遗传算法
Sep 18 Python
Python中Schedule模块使用详解 周期任务神器
Apr 19 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
PHP5常用函数列表(分享)
2013/06/07 PHP
phpstudy默认不支持64位php的解决方法
2017/02/20 PHP
php实现不通过扩展名准确判断文件类型的方法【finfo_file方法与二进制流】
2017/04/18 PHP
PHP登录验证功能示例【用户名、密码、验证码、数据库、已登陆验证、自动登录和注销登录等】
2019/02/25 PHP
基于ThinkPHP删除目录及目录文件函数
2020/10/28 PHP
js调用activeX获取u盘序列号的代码
2011/11/21 Javascript
Jquery实现自定义窗口随意的拖拽
2014/03/12 Javascript
查找Oracle高消耗语句的方法
2014/03/22 Javascript
js实现带缓冲效果的仿QQ面板折叠菜单代码
2015/09/06 Javascript
探索Vue.js component内容实现
2016/11/03 Javascript
JavaScript中校验银行卡号的实现代码
2016/12/19 Javascript
Bootstrap table 定制提示语的加载过程
2017/02/20 Javascript
Vue.js结合bootstrap实现分页控件
2017/03/10 Javascript
详解js删除数组中的指定元素
2018/10/31 Javascript
Vue基本使用之对象提供的属性功能
2019/04/30 Javascript
小程序异步问题之多个网络请求依次执行并依次收集请求结果
2019/05/05 Javascript
Vue keepAlive 数据缓存工具实现返回上一个页面浏览的位置
2019/05/10 Javascript
JavaScript实现五子棋游戏的方法详解
2019/07/08 Javascript
微信小程序 行的删除和增加操作实现详解
2019/09/29 Javascript
Js代码中的span拼接问题解决
2019/11/22 Javascript
VSCode 配置uni-app的方法
2020/07/11 Javascript
Python微信企业号开发之回调模式接收微信端客户端发送消息及被动返回消息示例
2017/08/21 Python
Python3 循环语句(for、while、break、range等)
2017/11/20 Python
python使用多进程的实例详解
2018/09/19 Python
python 为什么说eval要慎用
2019/03/26 Python
关于numpy数组轴的使用详解
2019/12/05 Python
在Python中用GDAL实现矢量对栅格的切割实例
2020/03/11 Python
商务英语专业毕业生自荐信
2013/11/05 职场文书
电信专业毕业生推荐信
2013/11/18 职场文书
CAD制图设计师自荐信
2014/01/29 职场文书
法律专业学生的自我评价
2014/02/07 职场文书
2015年客房服务员工作总结
2015/05/15 职场文书
Html5生成验证码的示例代码
2021/05/10 Javascript
Python如何识别银行卡卡号?
2021/06/10 Python
你需要掌握的20个Python常用技巧
2022/02/28 Python
Python必备技巧之函数的使用详解
2022/04/04 Python