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

前言

项目进行到快收尾的阶段,芯片及软硬件平台需要调试,调试测试的过程中都是大量的重复性工作,将这些繁琐的流程化的东西交给外包,仍然需要告诉他们什么时候该点击界面上的什么按钮,需要手动的创建文件夹,移动剪切等等,然后以此往复。。。 虽然不用自己动手,但是出错的可能性比较大,而且效率比较低,于是我想着写一个脚本来代替 按钮的点击 以及 文件夹的操作,仅需要外包的同事帮助我更换芯片和硬件测试平台即可。。。

一、工作流程

上位机平台使用的是MFC或是Qt的界面,调试的过程就是:装上芯片->硬件平台上电->软件平台上电->嵌入式软件的下载->按钮的点击->点击,点击再点击->判断输出结果是否符合预期->符合预期则生成工程文件->进行文件夹操作(创建、拷贝、复制)->截图保存->更换芯片
除了更换芯片,硬件平台的操作无法通过脚本执行,必须由人来操作之外,其余基本都可以通过软件脚本来解决,尤其是文件夹的操作,python实现起来就是两行代码的事情。至于上位机的按钮点击,虽然能拿到源码和API,但是用python调用起来毕竟麻烦,还不如直接open-cv对图像进行处理,识别出要点击的按钮位置,通过pyautogui自动点击相应的位置,截图保存的并放入特定的文件夹内,直接省去了截图和剪切复制的时间了。

二、使用步骤

1. 引入库

引入文件夹操作的库、图像识别库、截图工具库、自动鼠标点击库以及必不可少的时间库,缺少相应的库的话,直接pip3 install即可。

import os
from PIL import ImageGrab, Image
import time
import pyautogui
import cv2
import numpy as np

2. 按钮位置识别点击

网上搜到代码直接拿来用:通过模板匹配的方式,先自己截几张图,然后编辑裁剪出按钮作为模板,如图所示是我start按钮的裁剪出来的目标。
在这里插入图片描述
调用的时候直接将保持的模板名称作为参数传递即可。

# 如果是SNR测试
print("自动点击start")
Image_Compare("start.png")
def Image_Compare(picture):
    #截屏,同时提前准备一张屏幕上会出现的小图bd.png
    img = ImageGrab.grab()
    img.save('screen.png','png')
    #加载原始RGB图像
    img_rgb = cv2.imread("screen.png")
    #创建一个原始图像的灰度版本,所有操作在灰度版本中处理,然后在RGB图像中使用相同坐标还原
    img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
    #加载将要搜索的图像模板
    template = cv2.imread("模板路径"+picture,0)
    #使用matchTemplate对原始灰度图像和图像模板进行匹配
    res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)
    #设定阈值,0.8应该可以
    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]):
            # 识别出的图像所处位置,相对于屏幕分辨率来说的
            pyautogui.click(pt[0],pt[1])
            flag = 1
            break
    if(flag):
        print(picture+"点击succeess!")
    else:
	    # 还是有一定概率失败的,这时候人帮忙点一下就好
        print(picture+"点击fail!")
        input("请手动点击"+ picture + "所处位置,然后enter")  

3. 文件夹操作

输入一个工程文件夹名称,该文件夹内包含芯片的序号

def Create_project(project_name):
    # 如果没有path文件夹,就建一个文件夹
    project_name = Desktop + project_name
    if not os.path.exists(project_name):
        os.makedirs(project_name)    

import shutil        
def Move_SNR(content):
	# 将刚刚生成的content目录移动到SNR_content目录中
	 if os.path.exists(SNR_content):
	     shutil.move(SNR_content, content)
	 else:
	     print('snr不存在, 请先创建')  
           
# 创建一个工程文件
project_name = input("请输入工程名称:")
Create_project(project_name)

# 每颗芯片都要进行一轮测试流程
# 1.先点击start
# 2.然后创建snr
# 3.批量读写调整DC、Gain、平均次数
# 4.点击test,移动文件夹,截图
counts = int(input("请输入芯片序号:"))

strs = "/第"+ str(counts) + "颗"
if not os.path.exists(Desktop+project_name+strs):
    os.makedirs(Desktop+project_name+strs) 
else:
    print("已经存在这个序号了,是不是搞错了?") 

4. 截图操作

不同人打开软件,习惯将软件放在什么位置都不一样,所以干脆全屏截图了

def window_capture(content):
    # #这里首先利用tk视图ui框架获取分辨率
    # screen = tkinter.Tk()    
    # #获取当前屏幕的宽           
    # xw = screen.winfo_screenwidth()  
    # #获取当前屏幕的高  
    # yh = screen.winfo_screenheight()   

    # 给自己留时间打开需要打开的页面
    input("调整要截屏的视图(enter结束):")

    #整个屏幕截图
    img = ImageGrab.grab()
    #img = ImageGrab.grab(bbox=(100, 500, xw, yh)) 表示从x轴坐标100开始,y轴500开始

    # 保存在当前文件夹
    img.save(content+"/华为算法对比截图.jpg",'jpeg')

三、生成.exe文件

pyinstaller是个好东西,直接打包,pip3 install pyinstaller即可食用,用vs code使用的时候,可能会存在问题,我的问题是多个py版本冲突了。

# -F表示打包成一个exe文件,没有杂七杂八的
# -w 表示没有cmd控制台,看不到print的输出了
py -3.10 -m PyInstaller -F your.py

打包生成的exe,只要把图片等文件放到exe的参考目录里面,就可以随意使用了,如果要换台电脑,即使没有pip3的环境,没有安装相应的库,也是可以使用的,因为pyinstaller已经打包完毕了。
在这里插入图片描述

猜你喜欢

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