tkinter做一个秒表

文章目录

    • 需求和框架
    • 布局和主流程
    • 计时函数

需求和框架

本文试图实现一个简单的秒表,内容如下

在这里插入图片描述

这个软件非常简单,其UI元素只有一个文字标签外加三个按钮,这三个按钮的功能如下

  • 点击Start按钮,开始进行计时,同时Start变灰,无法点击
  • 点击Stop按钮,停止计时,同时Stop变灰,无法点击
  • 点击Reset按钮,则计时归0,若当前处于停止状态,则Reset变灰

则整个软件所需导入的模块以及整体框架如下

import tkinter as Tkinter
from datetime import datetime


class Clock():
    def __init__(self) -> None:
        root = Tkinter.Tk()
        root.title("Stopwatch")
        root.minsize(width=250, height=70)

        self.counter = 0
        self.running = False
        self.initWidgets(root)
        root.mainloop()

    def initWidgets(self, root): pass
    def count(self): pass
    def Start(self): pass
    def Stop(self): pass
    def Reset(self): pass

其中,counter为计数值,即点击Start之后经过的秒数;running为当前状态,如果正在计时,则为True,否则为False。

initWidgets是布局函数,Start, Stop, Reset分别是三个按钮的回调函数,count则用于计时。

下面的代码均为Clock中的方法,在使用时注意缩进。

布局和主流程

整个程序分为两个部分,上面的Label是第一部分,下面三个按钮共同组成第二部分,其布局代码如下

def initWidgets(self, root):
    self.label = Tkinter.Label(root,
            text='Ready!', font='Verdana 30 bold')
    self.label.pack()

    f = Tkinter.Frame(root)
    self.start = Tkinter.Button(f, text='Start', width=6,
                command=self.Start)
    self.stop = Tkinter.Button(f, text='Stop', width=6,
                state='disabled', command=self.Stop)
    self.reset = Tkinter.Button(f, text='Reset', width=6,
                state='disabled', command=self.Reset)

    f.pack(anchor='center', pady=5)
    self.start.pack(side='left')
    self.stop.pack(side='left')
    self.reset.pack(side='left')

三个按钮的三个回调函数如下,通过state来调整当前按钮的可用状态,若为disabled即表示不可用。当点击Start时,会调用计时函数count,这个函数在后面马上实现。

当点击Reset后,除了需要将label中的值初始化之外,还需要判断当前是否处于计时状态,如果已经停止计时,且已经Reset,则Reset按钮变灰。

    def Start(self):
        self.running = True
        self.count()
        self.start['state'] = 'disabled'
        self.stop['state'] = 'normal'
        self.reset['state'] = 'normal'

    def Stop(self):
        self.start['state'] = 'normal'
        self.stop['state'] = 'disabled'
        self.reset['state'] = 'normal'
        self.running = False

    def Reset(self):
        self.counter = 0
        if not self.running:
            self.reset['state'] = 'disabled'
        self.label['text'] = '00:00:00'

计时函数

一般来说,计时肯定要用到time.sleep,但在UI中,这种计时容易导致阻塞,进而窗口卡死,而要采用多线程,显然会增加程序的复杂程度。为此,可动用tkinter组件的after方法,以label.after(a,b)为例,表示经过a毫秒后,执行b。

下面即为采用after方法的计时函数。当程序不处于计时状态时,直接跳出。否则开始计时,当计数值为0时,标签显示Ready,否则显示的则是秒数。这里比较巧妙的方法是,等待1000毫秒,再重新调用自己,从而实现计时功能。

    def count(self):
        if not self.running:
            return
        if self.counter == 0:
            self.label['text'] = 'Ready!'
        else:
            tt = datetime.utcfromtimestamp(self.counter)
            self.label['text'] = tt.strftime('%H:%M:%S')

        self.label.after(1000, self.count)
        self.counter += 1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/396977.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

已解决:IDEA中@Autowired自动注入MyBatis Mapper报红警告的几种解决方法

今天在使用 IDEA 使用 MyBatis 的时候遇到了这种情况: 可以看到 userMapper 下有个红色的波浪警告,虽然代码没有任何问题,能正常运行,但是这个红色警告在这里杵着确实让人很窝心。 于是我在网上找了找,最终明白了原因…

【鸿蒙系统学习笔记】状态管理

一、介绍 资料来自官网:文档中心 在声明式UI编程框架中,UI是程序状态的运行结果,用户构建了一个UI模型,其中应用的运行时的状态是参数。当参数改变时,UI作为返回结果,也将进行对应的改变。这些运行时的状…

电脑提醒待办事项:高效、快捷、更科学的方法

在这个快节奏的社会里,我常常感到时间不够用,仿佛一天24小时根本不够我分配。每天都有一大堆待办事项等着我,但总是有这样那样的事情让我分心,导致我经常忘记一些重要的任务。 每次当我想起那些被遗忘的待办事项时,都…

本地创建Git仓库

在 Windows 下,可以通过以下步骤在本地创建一个 并模拟远程Git 仓库。 1、在命令行中打开模拟远程Git 仓库目标文件夹: 打开命令提示符或 PowerShell。例如: 创建裸仓库(模拟远程仓库):创建一个裸仓库&am…

亚马逊、沃尔玛、eBay等跨境平台自养号测评的风险和技术解析

亚马逊等平台延伸至世界各地,竞争激烈。许多卖家使用自养号测评来提高产品排名和销量。但自养号测评技术存在一定的技术局限性,很多卖家的账号因对自养号原理和底层环境搭建缺乏了解很多卖家的账号被关联封禁。本文将为您揭示自养号测评的风险&#xff0…

【小呆的力学笔记】弹塑性力学的初步认知四:简单应力状态下的应力应变关系

文章目录 2. 简单应力状态下的应力应变关系2.1 简单拉伸的应力应变关系2.2 真实应力应变关系2.3 应力-应变关系简化模型 2. 简单应力状态下的应力应变关系 我们在高中就学过,弹簧拉伸力和变形量成比例,对于一般的金属材料,在一定载荷以内这种…

Cadence Allegro PCB设计88问解析(三十三) 之 Allegro 中 Quick Reports的使用

一个学习信号完整性仿真的layout工程师 在进行PCB设计时,经常会查看一下整个PCB的基本信息,比如器件个数,网络数量、pin的数量。尤其在投板的时候还要查看下Dangling Lines、Dangling Vias等。还有其他的关于shape、via、走线、钻孔等等相关信…

顶顶通实时质检系统如何添加词库

文章目录 前言联系我们步骤1. 导入系统预置词库2. 手动添加词库 在实时质检时如何质检到词库 前言 本篇文章主要讲解顶顶通实时质检系统如何添加词库。 词库添加的方式: 导入系统预置词库手动添加词库 联系我们 有意向了解实时质检系统的用户,可以点击…

Photoshop 2023(Ps)下载安装及详细安装教程

Photoshop(Ps)的介绍 Adobe Photoshop,简称“PS”,是由AdobeSystems开发和发行的图像处理软件。Photoshop主要处理以像素所构成的数字图像。使用其众多的编修与绘图工具,可以有效地进行图片编辑和创造工作。PS有很多功能,在图像、…

grafana配置钉钉告警模版(一)

1、配置钉钉告警模版 创建钉钉告警模版,然后在创建钉钉告警时调用模版。 定义发送内容具体代码 my_text_alert_list 是模版名称后面再配置钉钉告警时需要调用。 {{/* 定义消息体片段 */}} {{ define "my_text_alert_list" }}{{ range . }}告警名称&…

术业有专攻!三防加固平板助力工业起飞

在日常使用中的商业电脑比较追求时效性,以市场定位做标准,内部元件只需满足一般要求就行,使用寿命比较短。而三防平板电脑是主要运用在复杂、恶劣的环境下所以在需求方面较高,需要保证产品在恶劣条件下正常使用,满足行业领域的需求…

springboot746旧物置换网站

springboot746旧物置换网站 获取源码——》公主号:计算机专业毕设大全

二维码钓鱼激增587%:用户陷入社交诈骗陷阱!

Check Point软件技术公司发布的新研究揭示了典型的QR码攻击,通过Check Point的实时网络威胁地图,在两周内发现了2万起QR码钓鱼和恶意软件攻击事件,突显了QR码在网络犯罪分子面前的脆弱性。 QR码是"Quick Response Code"&#xff08…

minio+nginx 集群快速搭建

文章目录 1、概要2、整体架构流程3、集群搭建3.1、服务器准备3.2、下载并安装3.3、minio集群配置3.4、minio.service配置3.5、启动 4、nginx 转发 1、概要 minIO 是一个开源的分布式对象存储服务,可用于构建高可用性和高扩展性的存储集群。 分布式架构:…

SpringSecurity + OAuth2 详解

SpringSecurity入门到精通 ************************************************************************** SpringSecurity 介绍 **************************************************************************一、入门1.简介与选择2.入门案例-默认的登录和登出接口3.登录经过了…

CSS SVG技术制作的复杂多层发光星形加载动画组件

<template><!-- 定义一个视图容器,用于展示加载动画 --><view class="loader"><svg viewBox="0 0 128 128" height="128" width="128" class="star"><defs><filter id="star-glow&q…

Windows下用CMake编译ITK及配置测试

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 ITK是什么&#xff1f; ITK&#xff08; Insight Segmentation and Registration Toolkit&#xff09;是美国国家卫生院下属的国…

MBD_入门篇_18_Simulink查表模块

18.Simulink查表模块 18.1 概述 LookUpTable&#xff0c;查表模块。比较常用的模块&#xff0c;参数较多&#xff0c;会复杂一点&#xff0c;比较重要的模块&#xff0c;一定掌握。 18.2 n-DLookUpTable N维查表模块 18.2.1 查表原理 通过有限的数据去得出相关的结果。比如我们…

Leo赠书活动-16期 名校毕业生教材

Leo赠书活动-16期 名校毕业生教材 ✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 赠…

Netdata:实时高分辨率监控工具 | 开源日报 No.173

netdata/netdata Stars: 63.9k License: GPL-3.0 Netdata 是一个监控工具&#xff0c;可以实时高分辨率地监视服务器、容器和应用程序。 以下是该项目的主要功能&#xff1a; 收集来自 800 多个整合方案的指标&#xff1a;操作系统指标、容器指标、虚拟机、硬件传感器等。实…