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中wx将图标显示在右下角的脚本代码
Mar 08 Python
python获取豆瓣电影简介代码分享
Jan 16 Python
Python greenlet实现原理和使用示例
Sep 24 Python
Python3字符串学习教程
Aug 20 Python
Python对文件操作知识汇总
May 15 Python
python实现批量修改文件名代码
Sep 10 Python
使用Python快乐学数学Github万星神器Manim简介
Aug 07 Python
pytorch使用 to 进行类型转换方式
Jan 08 Python
python GUI库图形界面开发之PyQt5拖放控件实例详解
Feb 25 Python
python实现网页录音效果
Oct 26 Python
Alpine安装Python3依赖出现的问题及解决方法
Dec 25 Python
Python selenium绕过webdriver监测执行javascript
Apr 12 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 ios推送(代码)
2013/07/01 PHP
PHP调用Linux命令权限不足问题解决方法
2015/02/07 PHP
PHP中捕获超时事件的方法实例
2015/02/12 PHP
PHP机器学习库php-ml的简单测试和使用方法
2017/07/14 PHP
PHP 实现手机端APP支付宝支付功能
2018/06/07 PHP
ThinkPHP框架结合Ajax实现用户名校验功能示例
2019/07/03 PHP
php 的多进程操作实践案例分析
2020/02/28 PHP
鼠标经过显示二级菜单js特效
2013/08/13 Javascript
js时间戳格式化成日期格式的多种方法
2013/11/11 Javascript
输入框过滤非数字的js代码
2014/09/18 Javascript
JavaScript实现弹出子窗口并传值给父窗口
2014/12/18 Javascript
jQuery实现判断滚动条到底部
2015/06/23 Javascript
举例讲解JavaScript substring()的使用方法
2015/11/09 Javascript
jQuery的层级查找方式分析
2016/06/16 Javascript
基于jQuery实现页面搜索功能
2020/03/26 Javascript
JavaScript随机生成颜色的方法
2016/10/15 Javascript
js以及jquery实现手风琴效果
2020/04/17 Javascript
js获取地址栏参数的两种方法
2017/06/27 Javascript
详解在React里使用"Vuex"
2018/04/02 Javascript
vue用递归组件写树形控件的实例代码
2018/07/19 Javascript
JS实现简单的星期格式转换功能示例
2018/07/23 Javascript
详解如何在webpack中做预渲染降低首屏空白时间
2018/08/22 Javascript
微信小程序实现日历功能
2018/11/27 Javascript
bootstrap下拉分页样式 带跳转页码
2018/12/29 Javascript
JS html事件冒泡和事件捕获操作示例
2019/05/01 Javascript
vuex实现数据状态持久化
2019/11/11 Javascript
在VUE中使用lodash的debounce和throttle操作
2020/11/09 Javascript
echarts柱状图背景重叠组合而非并列的实现代码
2020/12/10 Javascript
vant时间控件使用方法详解
2020/12/24 Javascript
Python中文件操作简明介绍
2015/04/13 Python
Python中列表与元组的乘法操作示例
2018/02/10 Python
对DJango视图(views)和模版(templates)的使用详解
2019/07/17 Python
PyCharm2018 安装及破解方法实现步骤
2019/09/09 Python
html+css3实现的登录界面
2020/12/09 HTML / CSS
管理学专业个人求职信范文
2013/09/21 职场文书
Go语言中的UTF-8实现
2021/04/26 Golang