近日,公司供电不稳定,时不时断电,对台式机很不友好。在经历了两次早晨一来发现电脑前一晚被强行断电关机的不愉快后,我决定写一个晚上可以自动把电脑休眠的工具。
最终成品图如下:
下面是施工过程:
一、任务目标与分析
任务目标:
- 每晚8点自动运行
- 执行休眠动作前倒计时提醒
- 可以取消休眠,可以把倒计时加时,可以重置倒计时时间
- 倒计时以界面的方式出现(而不是命令行),且置顶+不可关闭,窗体可拖动
分析:
-
自动运行使用win的任务计划程序
-
程序使用python3.6编写,界面使用Python 的标准 Tk GUI 工具包的接口tkinter。tkinter官方文档
大神详细讲解
二、界面设计/功能设计
1、界面大小与常见的右下角悬浮窗类似。
2、界面有三个按钮对应三个小功能,分别是“重置“、”加时“、”取消“。
3、为了不影响正常工作,界面应置顶且有一定的透明度,界面不在焦点时应把透明度进一步调低。界面应可拖动。
4、为了美观,应把python运行的命令行隐藏,将状态栏和标题栏隐藏。
三、代码实现
代码主要分为两个部分:窗体模块和计时模块
1、窗体模块:
(1) 隐藏命令行显示:
# 隐藏命令行窗口
import ctypes
#调用kernel32.dll获取当前命令行的句柄
whnd = ctypes.windll.kernel32.GetConsoleWindow()
if whnd != 0:
#隐藏命令行窗口
ctypes.windll.user32.ShowWindow(whnd, 0)
#释放句柄资源(句柄类似于指针,这里只关闭了句柄,并不关闭线程)
ctypes.windll.kernel32.CloseHandle(whnd)
(2) 界面
界面使用tkinter组件
依赖的包:
import tkinter
from tkinter import *
获取焦点、获取鼠标动作等事件需要将窗体绑定windows事件。窗体的绑定事件代码格式为:
root.bind("<B1-Motion>", change)
设定窗体的各项参数:
#创建根窗体
root = tkinter.Tk()
#初始化窗体
def tkinterInit():
# 设定位置
root.geometry('260x120-10-40')
# UI窗口置于顶层
root.wm_attributes('-topmost', 1)
#标题栏标题
root.title("即将休眠")
# 背景色
root["background"] = "white"
# 设置透明度
root.attributes("-alpha", 0.8)
# 绑定win鼠标移动事件
# <B1-Motion> 拖动左键触发事件
# <B2-Motion> 拖动中键触发事件
# <B3-Motion> 拖动右键触发事件
root.bind("<B1-Motion>", change)
# 鼠标左键按下,2表示中键,3表示右键;
root.bind("<Button-1>", btnDown)
# 获取焦点
root.bind("<FocusIn>", focusIn)
# 失去焦点
root.bind("<FocusOut>", focusOut)
# 不可改变窗口大小
root.resizable(False, False)
# 设置窗口为工具样式:
# root.attributes("-toolwindow", True)
# # 设置全屏:
# root.attributes("-fullscreen", True)
# 设置成脱离工具栏样式(取消标题栏和状态栏图标)
root.overrideredirect(True)
创建窗口上的其他组件:
#创建窗口
def startTkinter():
global timer
tkinterInit()
# 提示标签
title = Label(root, text='距离休眠时间还有:', bg="white")
# 时间显示标签
timer = Label(root, textvariable=nowTime, fg="red", bg="white", font="黑体")
#1000ms后调用updateTime函数
timer.after(1000, updateTime)
# “重置”与“加时”按钮需要在一行,故把两个按钮放入一个框架内。
frame = tkinter.Frame(root)
#按钮方法需要使用函数名(不带括号)或lambda表达式调用函数
resetBtn = Button(frame, text='重置'
, command=resetTime
, width