# -*- coding: utf-8 -*-
# @Time : 2023/4/4 21:53
# @File : 定时器gui.py
# @Software: PyCharm Community Edition '''
用tkinter制作一个图形化定时器
'''
from tkinter import *
from tkinter import messagebox
import io
import threading
# import win32gui, winsound
import argparse class Timer:
def __init__(self, Minutes, Seconds):
self.state = {'isStop': False, 'minutes': Minutes, 'seconds': Seconds}
self.createContainer() # 创建容器
def createContainer(self):
# 创建窗口实例
self.window = Tk()
self.window.title('Timer')
# 禁止全屏
self.window.resizable(False, False) self.addWidgets()
# 开启定时
self.startTimer()
# 修改主窗口退出协议
self.window.protocol('WM_DELETE_WINDOW', self.closeWindow) # 返回屏幕的宽高
# win_w = self.tk.winfo_screenwidth()
# win_h = self.tk.winfo_screenheight()
# 返回需要的宽高
x = self.window.winfo_reqwidth()
y = self.window.winfo_reqheight()
# 设置初始位置
self.window.geometry("%dx%d+%d+%d" % (208, 56, 10, 10))
# 修改图标(对启动速度有点影响)
# self.window.iconbitmap('title.ico')
# 主事件循环
self.window.mainloop() # 添加组件
def addWidgets(self):
self.Minutes = IntVar()
self.Minutes.set(self.state['minutes'])
self.Seconds = IntVar()
self.Seconds.set(self.state['seconds'])
# relief :设置3D效果
self.e_minutes = Entry(self.window, relief=RAISED, justify=RIGHT, font='Helvetica 34 bold', state='readonly',
width=2, textvariable=self.Minutes)
self.e_seconds = Entry(self.window, relief=RAISED, justify=RIGHT, font='Helvetica 34 bold', state='readonly',
width=2, textvariable=self.Seconds)
self.btn_stop_start = Button(self.window, text='Start', font='Helvetica 10', width=10, command=self.changeTimer)
self.btn_reset = Button(self.window, text='Reset', font='Helvetica 10', width=10, command=self.resetTime) # 组件布局
self.e_minutes.grid(row=0, column=0, rowspan=2)
Label(self.window, font='Helvetica 25 bold', text=':').grid(row=0, column=1, rowspan=2) # 装饰作用
self.e_seconds.grid(row=0, column=2, rowspan=2)
self.btn_stop_start.grid(row=0, column=3, sticky='e')
self.btn_reset.grid(row=1, column=3, sticky='e') # 更新时间
def updateTime(self):
# 避免按下暂停,线程还在执行
if self.state['isStop'] == True:
return
if self.Seconds.get() < 59:
self.Seconds.set(self.Seconds.get() + 1)
self.window.update()
elif self.Seconds.get() == 60 and self.Minutes.get() < 60:
self.Seconds.set(0)
self.Minutes.set(self.Minutes.get() + 1)
self.window.update() elif self.Seconds.get() == 60 and self.Minutes.get() == 60: # 没时间了,发声提示
self.Seconds.set(0)
self.window.update()
self.state['isStop'] = True # 用于停止刷新时间
self.alert()
self.startCicle() def updateTime1(self):
# 避免按下暂停,线程还在执行
if self.state['isStop'] == True:
return
if self.Seconds.get() > 0:
self.Seconds.set(self.Seconds.get() - 1)
self.window.update()
elif self.Seconds.get() == 0 and self.Minutes.get() > 0:
self.Seconds.set(59)
self.Minutes.set(self.Minutes.get() - 1)
self.window.update() elif self.Seconds.get() == 0 and self.Minutes.get() == 0: # 没时间了,发声提示
self.Seconds.set(0)
self.window.update()
self.state['isStop'] = True # 用于停止刷新时间
self.alert()
self.startCicle() # 关闭窗口 def closeWindow(self):
if self.state['isStop'] == False:
if messagebox.askyesno('It`s not time.', 'Are you sure stop?'):
self.state['isStop'] = True
self.window.quit()
else:
self.window.quit() # 重置时间
def resetTime(self):
self.Minutes.set(self.state['minutes'])
self.Seconds.set(self.state['seconds']) # 更改定时状态
def changeTimer(self):
if self.state['isStop'] == True:
self.state['isStop'] = False
self.startTimer()
else:
self.state['isStop'] = True
self.stopTimer() # 开启循环
def startCicle(self):
if self.state['isStop'] == True:
return
threading.Timer(1, self.updateTime).start() # 开始定时
def startTimer(self):
# 在时间停止时,可以修改定时时间
self.state['minutes'] = self.Minutes.get()
self.state['seconds'] = self.Seconds.get()
self.e_minutes['state'] = 'readonly'
self.e_seconds['state'] = 'readonly'
self.btn_stop_start['text'] = 'Stop'
self.window.update()
self.startCicle() # 暂停定时
def stopTimer(self):
self.btn_stop_start['text'] = 'Start'
self.e_minutes['state'] = 'normal'
self.e_seconds['state'] = 'normal'
self.window.update() # 发声提示
# def alert(self):
# winsound.Beep(600, 3000) # 发出声音提示 默认闹3s if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('-m', type=int, default=0, help='set minutes for timer')
parser.add_argument('-s', type=int, default=0, help='*set seconds for timer')
args = parser.parse_args()
Timer(args.m, args.s)

python3 gui 计时器的更多相关文章

  1. Python3 GUI开发(PyQt)安装和配置

    Python3 GUI开发(PyQt5)安装和配置: 下载安装好Miniconda3, 并且安装好jupyter 注意:最好关闭360杀毒软件或者把cmd加入信任,否则运行activate会有问题. ...

  2. Python3 GUI:PyQt5环境搭建

    配置镜像源 最近用Python内置的Thinter写了个小工具,发现界面略朴素,于是决定转向PyQt5.先配置镜像源,否则只能龟速下载. C:\Users\你的用户名下新建目录pip 在pip目录下新 ...

  3. python3 井字棋 GUI - 人机对战、机器对战 (threading、tkinter库)

    python3 井字棋 GUI - 人机对战.机器对战 功能 GUI界面 人机对战(可选择机器先走) 机器对战(50局) 流程图 内核 棋盘 [0][1][2] [3][4][5] [6][7][8] ...

  4. 微信小游戏跳一跳简单手动外挂(基于adb 和 python)

    只有两个python文件,代码很简单. shell.py: #coding:utf-8 import subprocess import math import os def execute_comm ...

  5. Django项目常见面试问题

    1.python中的lambda是什么意思,可以举例 匿名函数 a = lambda x:x+1 print(a(1)) 2.请写出以下代码执行的结果 class Parent(object): x ...

  6. Java之线程———GUI线程(包含打字游戏和计时器俩个GUI实列)

    当java程序包含图形用户界面(GUI)时,Java虚拟机在运行应用程序时会自动启动更多的线程,其中有两个重要的线程:AWT-EventQuecue 和 AWT-Windows. AWT-EventQ ...

  7. 程序员之路:python3+PyQt5+pycharm桌面GUI开发(转)

    程序员之路:python3+PyQt5+pycharm桌面GUI开发 http://blog.sina.com.cn/s/blog_989218ad0102wz1k.html 先看效果: 图 1 没错 ...

  8. Python3+PyQt5+PyCharm 桌面GUI开发环境搭建

    Python3+PyQt5+PyCharm 桌面GUI开发环境搭建 一.安装python PyQt5所支持的python版本是不低于3.5版本 python3.5以上的版本安装:https://www ...

  9. python3.4学习笔记(九) Python GUI桌面应用开发工具选择

    python3.4学习笔记(九) Python GUI桌面应用开发工具选择 Python GUI开发工具选择 - WEB开发者http://www.admin10000.com/document/96 ...

  10. 使用Python3.6的标准GUI库tkinter快速创建GUI应用程序

    Python 提供了多个图形开发界面的库,几个常用 Python GUI 库如下: Tkinter: Tkinter 模块(Tk 接口)是 Python 的标准 Tk GUI 工具包的接口 .Tk 和 ...

随机推荐

  1. 逍遥自在学C语言 | 多级指针探秘

    前言 多级指针在C语言中是一种特殊的指针类型,它可以指向其他指针的指针. 通过多级指针,我们可以间接地访问或修改存储在内存中的数据. 在本文中,我们将讨论多级指针的概念.使用方法.使用场景以及常见错误 ...

  2. 用XmlSerializer.Deserialize将XML转实体遇到的问题

    1.命名空间的问题 1.1 XML示例: 1.2 反序列化代码: 点击查看源代码 ``` public static object DeserializeFromXml<T>(string ...

  3. [随笔]记一此更新win10后mysql服务消失的问题

    十几天前系统自动更新 没在意 几天前用php连mysql的时候 报错 Fatal error: Uncaught PDOException: SQLSTATE[HY000] [2002] 由于目标计算 ...

  4. 为什么使用ioutil.ReadAll 函数需要注意

    1. 引言 当我们需要将数据一次性加载到内存中,ioutil.ReadAll 函数是一个方便的选择,但是ioutil.ReadAll 的使用是需要注意的. 在这篇文章中,我们将首先对ioutil.Re ...

  5. 即构推出低延迟直播产品L3,可将直播延迟降到1s

    近日,全球云通讯服务提供商ZEGO即构科技推出低延迟直播产品Low-Latency Live,简称L3.这款产品对传统CDN直播中"延迟较大.弱网抗性差.观众端内容不同步"等问题进 ...

  6. Python数据分析易错知识点归纳(二):Numpy

    二.numpy 不带括号的基本属性 arr.dtype arr.shape # 返回元组 arr.size arr.ndim # 维度 arr.reshape/arr.resize/np.resize ...

  7. 获取客户端真实 IP 地址的最佳实践

    一.背景 1. 业务上云带来性能收益 公司从去年全面推动业务上云,而以往 IDC 架构部署上,接入层采用典型的 4 层 LVS 多机房容灾架构,在业务高峰时期,扩容困难(受限于物理机资源和 LVS 内 ...

  8. 为什么Python是数据科学家的首选语言

    这篇文章全面探讨了Python作为数据科学领域首选语言的原因.从Python的历史.特性,到在数据科学中的应用实例,再到与其他数据科学语言的比较,以及在实际企业中的应用,我们深入剖析了Python的优 ...

  9. 使用JMeter连接达梦数据库的步骤和示例

    引言: 本文将介绍如何使用JMeter连接达梦数据库,并提供连接达梦数据库的步骤和示例,帮助您快速开始进行数据库性能测试. 步骤: 1. 下载并安装JMeter:首先,从JMeter官方网站下载并安装 ...

  10. 论文解读(BERT-DAAT)《Adversarial and Domain-Aware BERT for Cross-Domain Sentiment Analysis》

    论文信息 论文标题:Adversarial and Domain-Aware BERT for Cross-Domain Sentiment Analysis论文作者:论文来源:2020 ACL论文地 ...