前言
在第一篇文章中,通过了python调用opencv的模板匹配函数,通过对屏幕截图然后和模板对比,实现了上位机界面的自动点击。理论上只要是能出现图片的地方,就能使用这种方式,实现自动点击。
正好最近国家倡导节约用电,我司紧跟国家号召,在大家的电脑上部署了省电系统,只要长时间不动鼠标键盘,电脑就会自动锁屏睡眠,时间间隔大约5分钟,经常出去上个厕所打杯水的时间,回来电脑就锁上了,有点影响工作(绝不是影响摸鱼)。。。
一、工作流程
干掉电脑自动锁屏和我所说的图片模板匹配脚本有啥关系呢?其实是这样的:电脑自动锁屏并不是到时间就直接锁住,而是现在桌面上出现一个弹窗,上面会出现倒计时,如果倒计时结束还没有操作则锁屏,如果动了鼠标或键盘则弹窗消失。其实说到这里就能发现,干掉自动锁屏的代码逻辑和上位机界面自动点击的效果是一样的。
如图所示是弹窗的部分截图(没必要选完成的图作为模板,只要选择有特征的即可),因为倒计时出现的时候,还有两分钟时间可以操作,所以我们程序只需要每隔一分钟截个屏幕的图,然后和模板进行对比,判断是否出现弹窗,如果出现了弹窗,通过pyautogui自动移动一下鼠标即可,和第一篇文章的函数调用都是一样的,只要改一下延时即可。
二、使用步骤
1. 引入库
引入文件夹操作的库、图像识别库、截图工具库、自动鼠标点击库以及必不可少的时间库,缺少相应的库的话,直接pip3 install即可。相比上一篇的脚本,多了一个sleep操作和图片对比结束之后,将截图删除。
在main中对Image_Compare函数try了一次是因为,以上截图对比的逻辑都是在工作状态,即原本电脑就是没有锁屏的状态,所以当程序运行的过程中人为的win+L锁屏了,程序执行到这里就会报错。
import os
from PIL import ImageGrab, Image
import time
import pyautogui
import cv2
import numpy as np
2. 按钮位置识别点击
def Image_Compare(self, picture):
#截屏,同时提前准备一张屏幕上会出现的小图bd.png
img = ImageGrab.grab()
img.save(Desktop+'screen.png','png')
#加载原始RGB图像
img_rgb = cv2.imread(Desktop+"screen.png")
#创建一个原始图像的灰度版本,所有操作在灰度版本中处理,然后在RGB图像中使用相同坐标还原
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
#加载将要搜索的图像模板
template = cv2.imread(Desktop+picture,0)
#使用matchTemplate对原始灰度图像和图像模板进行匹配
res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)
#设定阈值,0.7应该可以
threshold = 0.8
#res大于99.9%
loc = np.where( res >= threshold)
flag = 0
#得到原图像中的坐标
for pt in zip(*loc[::-1]):
if(pt[0] and pt[1]):
# print(pt[0],pt[1])
pyautogui.click(pt[0],pt[1])
flag = 1
break
if(flag):
print(picture+"capture succeess!")
else:
# print(picture+"capture fail!")
pass
os.remove(Desktop+'screen.png')
def main(self):
while(True):
try:
self.Image_Compare(Picture)
except:
print("锁屏了,省电成功,呜呜")
# 自动锁屏大概时间间隔是5,6分钟,延时时间设为一分钟
sleep(60*1)
3. 生成.exe文件
pyinstaller是个好东西,直接打包,pip3 install pyinstaller即可食用,用vs code使用的时候,可能会存在问题,我的问题是多个py版本冲突了。打包生成的exe,只要把图片等文件放到exe的参考目录里面,就可以随意使用了,如果要换台电脑,即使没有pip3的环境,没有安装相应的库,也是可以使用的,因为pyinstaller已经打包完毕了。
# -F表示打包成一个exe文件,没有杂七杂八的
# -w 表示没有cmd控制台,看不到print的输出了
py -3.10 -m PyInstaller -F -w your.py
三、坑点
1. 原因
双击生成的exe文件,因为使用pyinstaller加了-w参数(不加的话会有终端框出来,太影响了),所以启动程序之后,不会有终端黑框出来,也就看不到print的输出了,当然这只是小问题,只要能拒绝锁屏就行。
但这玩意儿实在太安静了,完全没有提示框,没有桌面图标显示,很多时候都不知道自己到底有没有运行程序,只能到任务管理器里面,慢慢的找才能看的到。。。有的时候忘记了,还会启动好几个程序,感觉占用的“大量”系统资源,强迫症难受
2.解决方案
于是乎,我想着能不能用pyqt写个简单的界面,按钮点击就启动拒绝锁屏功能,这样还能有个图标挂着,随时能看到。
3. 安装引入库
pip3 install pyqt5
pip3 install PyQt5-tools -i http://pypi.douban.com/simple --trusted-host=pypi.douban.com
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
作为一个二次元用户,背景、图标啥的要安排上,先上一个截止目前的效果:
目前已实现功能:
1. 拒绝省电
2. 系统托盘图标和弹窗
3. 界面右键列表
4. 音乐播放器
5. 靠边隐藏
6. 背景圆圈线条美化
7. 宠物挂件
8. 按钮点击抖动窗口
9. 开机动图
10. 气泡弹窗提示
10.窗口淡入淡出
11. 。。。
参考的大神比较多,感谢大家无私的奉献
主要是UI部分:https://zmister.com/archives/477.html
美化功能部分:https://github.com/PyQt5/PyQt
桌面宠物部分:https://zhuanlan.zhihu.com/p/376288986