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获取当前日期前后N天或N月日期的方法示例
Jul 30 Python
python使用threading获取线程函数返回值的实现方法
Nov 15 Python
Python实现的排列组合、破解密码算法示例
Apr 12 Python
python使用pandas处理大数据节省内存技巧(推荐)
May 05 Python
python实现倒计时小工具
Jul 29 Python
vim自动补全插件YouCompleteMe(YCM)安装过程解析
Oct 21 Python
python如何通过闭包实现计算器的功能
Feb 22 Python
python GUI库图形界面开发之PyQt5动态(可拖动控件大小)布局控件QSplitter详细使用方法与实例
Mar 06 Python
python实现俄罗斯方块游戏(改进版)
Mar 13 Python
解决使用python print打印函数返回值多一个None的问题
Apr 09 Python
Python实现进度条和时间预估的示例代码
Jun 02 Python
python中的yield from语法快速学习
Nov 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
DC的38部超级英雄动画电影
2020/03/03 欧美动漫
功能齐全的PHP发送邮件类代码附详细说明
2008/07/10 PHP
thinkPHP5框架接口写法简单示例
2019/08/05 PHP
thinkphp框架表单数组实现图片批量上传功能示例
2020/04/04 PHP
用js实现的页面关键字密度查询代码
2007/12/27 Javascript
用于判断用户注册时,密码强度的JS代码
2009/01/01 Javascript
基于jQuery试卷自动排版系统
2010/07/18 Javascript
jQuery中 noConflict() 方法使用
2013/04/25 Javascript
客户端js性能优化小技巧整理
2013/11/05 Javascript
Jquery操作js数组及对象示例代码
2014/05/11 Javascript
jquery实现保存已选用户
2014/07/21 Javascript
JavaScript控制两个列表框listbox左右交换数据的方法
2015/03/18 Javascript
javascript中window.open在原来的窗口中打开新的窗口(不同名)
2015/11/15 Javascript
jQuery使用ajax跨域获取数据的简单实例
2016/05/18 Javascript
js遍历map javaScript遍历map的简单实现
2016/08/26 Javascript
AngularJs $parse、$eval和$observe、$watch详解
2016/09/21 Javascript
JavaScript浏览器对象模型BOM(BrowserObjectModel)实例详解
2016/11/29 Javascript
JavaScript中清空数组的方法总结
2016/12/02 Javascript
微信小程序 动态的设置图片的高度和宽度详解及实例代码
2017/02/24 Javascript
Router解决跨模块下的页面跳转示例
2018/01/11 Javascript
vue.js响应式原理解析与实现
2020/06/22 Javascript
Vue实例的对象参数options的几个常用选项详解
2019/11/08 Javascript
JS插件amCharts实现绘制柱形图默认显示数值功能示例
2019/11/26 Javascript
vue el-table实现自定义表头
2019/12/11 Javascript
vue props 单项数据流实例分享
2020/02/16 Javascript
[01:01:24]DOTA2上海特级锦标赛A组败者赛 EHOME VS CDEC第三局
2016/02/25 DOTA
详解Python编程中对Monkey Patch猴子补丁开发方式的运用
2016/05/27 Python
Python实现的基数排序算法原理与用法实例分析
2017/11/23 Python
python pandas实现excel转为html格式的方法
2018/10/23 Python
通过python爬虫赚钱的方法
2019/01/29 Python
Vs Code中8个好用的python 扩展插件
2020/10/12 Python
教师读书活动总结
2014/05/07 职场文书
2015年万圣节活动总结
2015/03/24 职场文书
初婚初育证明范本
2015/06/18 职场文书
Python中Permission denied的解决方案
2021/04/02 Python
MySQL优化之如何写出高质量sql语句
2021/05/17 MySQL