# -*- 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. IDEA的安装准备

    IDEA的安装 第一步 第二步 第三部 第四步

  2. Pinot2的无人机任务和数据处理实践

    目录 1. 引言 2. 技术原理及概念 2.1 基本概念解释 2.2 技术原理介绍 2.3 相关技术比较 3. 实现步骤与流程 4. 应用示例与代码实现讲解 4.1 应用场景介绍 4.2 应用实例分析 ...

  3. TP5 where查询一个字段不等于多个值

    // 组装where条件$wheres = [];// 后台人员类型$people = input('people','');switch($people){ case "跟单员" ...

  4. 1.4 编写简易ShellCode弹窗

    在前面的章节中相信读者已经学会了使用Metasploit工具生成自己的ShellCode代码片段了,本章将继续深入探索关于ShellCode的相关知识体系,ShellCode 通常是指一个原始的可执行 ...

  5. 【调制解调】AM 调幅

    说明 学习数字信号处理算法时整理的学习笔记.同系列文章目录可见 <DSP 学习之路>目录.本篇介绍 AM 调幅信号的调制与解调,内附全套 MATLAB 代码. 目录 说明 1. AM 调制 ...

  6. 说说 Go 语言的坑(二)

    上一篇文章 说说 Go 语言 for-range 的坑 说的是 for-range 的,工作中,其实还是遇到蛮多奇奇怪怪的问题,这里也顺便整理了一下,就当作是续集:) 先继续看 for-range 的 ...

  7. rsync 命令

    linux上的rsync命令详解 15个rsync命令实施 -z: --compress 使用压缩机制 -v: --verbose 打印详细信息 -r: --recursive 以递归模式同步子目录 ...

  8. 你不知道的 HTTP Referer

    前言 上周突然发现自己的自己站点的图片全都403了,之前还是好好的,图片咋就全都访问不了呢?由于我每次发文章都是先发了掘金,然后再从掘金拷贝到我自己的站点,这样我就不用在自己的站点去上传图片了,非常方 ...

  9. 【overcome error】dereferencing pointer to incomplete type

    @ 目录 前言 解决 代码情况 分析问题 尾声 前言 这个问题是我在学习数据结构链栈部分遇到的,英文报错如题所示,中文意思是:取消引用不完整类型的指针,在百度一圈也没明白,(百度搜索,看一个和全看基本 ...

  10. Axios向后段请求数据GET POST两种方法的不同之处

    GET请求 向后端请求时,通过URL向后端传递参数 axios({ url:'http://127.0.0.1:9000/get-user-list/', type:'json', //GET方法携带 ...