关于我想写个脚本,最后却搞了个桌面宠物这件事(二)

前言

在第一篇文章中,通过了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

猜你喜欢

转载自blog.csdn.net/qq_34935373/article/details/123227372