python 自动化学习(二) 简单结合xlrd的自动化
创始人
2024-06-03 12:22:47
0

现在不让篇幅太长了,分开写

5、屏幕截取

我们平时点鼠标肯定都是先看到要打开的文件才去操作的,但我们怎么让程序知道要打开的文件在哪里呢,就需要屏幕截取的功能

pyautogui.screenshot()截取全屏
pyautogui.position()获取鼠标当前坐标
getpixel((100, 500))获取指定坐标rpg值(颜色)
pyautogui.pixelMatchesColor(100,500,(12,120,400))基于坐标匹配颜色

案例 指定截图

import pyautoguiprint(pyautogui.position())  #获取鼠标当前坐标im=pyautogui.screenshot()  #截取整个屏幕
im.save("123.png")         #图片保存om=im.crop((284,416,302,438))       #选择性截取一段位置的图片
om.save("456.png")                  #保存截图

我们如果拿到上面的代码直接跑你会发现456.png 的截图是一个莫名其妙的位置,我们需要先给他一个准确的坐标,利用pyautogui.position()获取到准确的坐标后,再去设置截图的位置

技巧:将鼠标放到截图的位置中间最下面ctrl + F5 运行程序

 

说明 im.crop(())

im.crop((188,360,288,460))刚开始不太明白这个值是要怎么写,记录一下
前面两个值是188,360指的是坐标,我们上面不是截图全屏吗,im.crop是基于全屏截图去截取的
这种在这里前两个值(鼠标位置)就是起点,而后面两个值可以理解为我们截图要先点住起点
然后向右下角拖动的过程,我上面的案例就是在前面的坐标 加了100得到 100*100大小的截图

 6、屏幕识别

我们现在拿到了图片,剩下的就是从全屏来获取这个图片在那里了

方法作用
pyautogui.locateOnScreen('1.png')识别单个图片坐标
pyautogui.locateAllOnScreen('1.png')识别多个图片坐标

 案例

import pyautogui# 图像识别(一个)
oneLocation = pyautogui.locateOnScreen('456.png')
print(oneLocation)# 图像识别(多个)
allLocation = pyautogui.locateAllOnScreen('456.png')
print(list(allLocation))

这里我们直接用上面案例截图出来的456.png图片

返回

Box(left=188, top=360, width=100, height=100)
[Box(left=188, top=360, width=100, height=100)]

可以看到和我们上面截图的坐标、大小是一致的

7、好用的图片坐标识别

pyautogui自带的识别有时候不准,而且用截图工具的图片有时候也不好使,在网上找了个好使的备份一下

装模块

pip install numpy
pip install opencv-python
pip install opencv-contrib-python

案例

import cv2
import pyautogui#定义主类,
class ImageMatch:def __init__(self,Src,Srctempl):self.src = Srcself.srctempl = Srctempl#当前类的入口函数def main(self):result, imagebase, imagetempl = self.match(self.src, self.srctempl)X,Y=self.GetPoint(result,imagebase,imagetempl)return X,Y#获取匹配结果def match(self,src,srctempl):method=5#cv::TM_CCOEFF_NORMED = 5 标准相关匹配imagebase=cv2.imread(src)#self.show(imagebase ,"imagebase")# imagetempl = imagebase[15:137,134:183].copy()imagetempl=cv2.imread(srctempl)#self.show(imagetempl ,"imagetempl")print('imagetempl.shape:',imagetempl.shape)shape=imagetempl.shaperesult=cv2.matchTemplate(imagebase,imagetempl,method)print('result.shape:',result.shape)print('result.dtype:',result.dtype)return result,imagebase,imagetempl#获取匹配结果2#计算中心点位置def GetPoint(self,result,imagebase,imagetempl):method=5min_max = cv2.minMaxLoc(result)if method == 0 or method == 1:   #根据不同的模式最佳匹配位置取值方法不同match_loc = min_max[2]else:match_loc = min_max[3]right_bottom = (match_loc[0] + imagetempl.shape[1], match_loc[1] + imagetempl.shape[0])print('result.min_max:',min_max,'method=',method)X=int(match_loc[0])+int((right_bottom[0]-match_loc[0])/2)Y=int(match_loc[1])+int((right_bottom[1]-match_loc[1])/2)print(X,Y)if method==5 and float(min_max[1])< 0.5:X=0Y=0#标注位置img_disp = imagebase.copy()cv2.rectangle(img_disp, match_loc,right_bottom, (0,255,0), 5, 8, 0 )cv2.normalize( result, result, 0, 255, cv2.NORM_MINMAX, -1 )cv2.circle(result, match_loc, 10, (255,0,0), 2 )return X,Ydef jietu(select_image):#截图是先截取当前页面的一张大图im = pyautogui.screenshot()im.save("global.png")src="./global.png"srctempl=select_imageimageMatch= ImageMatch(src,srctempl)  #需要获取的小图X,Y = ImageMatch.main(imageMatch)return X,Yif __name__ == '__main__':#上面所有的东西都不用管,直接调用截图的方法 传入要检查的图片即可#返回图片的坐标addr = ImageMatch.jietu("1.png")pyautogui.doubleClick(addr)

因为平时跑idea的时候笔记本噪音太大,我是用腾讯云windows server2019 跑程序的,但是相同的程序,在做笔记之前是能识别到的,现在怎么都会识别错误,打包好的程序在自己电脑上是可以的,服务器上不行,理解不得。。

server跑的

我自己电脑跑的

额,有谁碰上了一起唠唠

8、配合xlrd模块实现的快速编辑步骤

这段程序是取自B站水哥(不高兴就喝水)的案例,但我这边用的时候有很多卡住的地方,这里稍稍做点改变

import xlrd
import cv2
import pyautogui
import pyperclip
import time#定义主类,
class ImageMatch:def __init__(self,Src,Srctempl):self.src = Srcself.srctempl = Srctempl#当前类的入口函数def main(self):result, imagebase, imagetempl = self.match(self.src, self.srctempl)X,Y=self.GetPoint(result,imagebase,imagetempl)return X,Y#获取匹配结果def match(self,src,srctempl):method=5#cv::TM_CCOEFF_NORMED = 5 标准相关匹配imagebase=cv2.imread(src)#self.show(imagebase ,"imagebase")# imagetempl = imagebase[15:137,134:183].copy()imagetempl=cv2.imread(srctempl)#self.show(imagetempl ,"imagetempl")print('imagetempl.shape:',imagetempl.shape)shape=imagetempl.shaperesult=cv2.matchTemplate(imagebase,imagetempl,method)print('result.shape:',result.shape)print('result.dtype:',result.dtype)return result,imagebase,imagetempl#获取匹配结果2#计算中心点位置def GetPoint(self,result,imagebase,imagetempl):method=5min_max = cv2.minMaxLoc(result)if method == 0 or method == 1:   #根据不同的模式最佳匹配位置取值方法不同match_loc = min_max[2]else:match_loc = min_max[3]right_bottom = (match_loc[0] + imagetempl.shape[1], match_loc[1] + imagetempl.shape[0])print('result.min_max:',min_max,'method=',method)X=int(match_loc[0])+int((right_bottom[0]-match_loc[0])/2)Y=int(match_loc[1])+int((right_bottom[1]-match_loc[1])/2)print(X,Y)if method==5 and float(min_max[1])< 0.5:X=0Y=0#标注位置img_disp = imagebase.copy()cv2.rectangle(img_disp, match_loc,right_bottom, (0,255,0), 5, 8, 0 )cv2.normalize( result, result, 0, 255, cv2.NORM_MINMAX, -1 )cv2.circle(result, match_loc, 10, (255,0,0), 2 )return X,Ydef jietu(select_image):#截图是先截取当前页面的一张大图im = pyautogui.screenshot()im.save("global.png")src="./global.png"srctempl=select_imageimageMatch= ImageMatch(src,srctempl)  #需要获取的小图X,Y = ImageMatch.main(imageMatch)return X,Ydef dataCheck(sheet1):#1、默认认为他们都是有数据的checkCmd = True#2、通过sheet1.nrows 来获取有效的行数#因为我们给定的标是有标题的,所以不能小于2,最小也是要等于2if sheet1.nrows < 2:print("没数据啊哥")checkCmd = False#3、循环有效的行i = 1while i < sheet1.nrows:#获取第i行,第一列的值cmdType = sheet1.row(i)[0]#4、多层判断,检查每一行的第二列是否合法(1-6)#cmdType.ctype 是判断(1-6)第一列是不是数字,如果不是数字就直接报错if cmdType.ctype != 2 or (cmdType.value != 1.0 and cmdType.value != 2.0 and cmdType.value != 3.0and cmdType.value != 4.0 and cmdType.value != 5.0 and cmdType.value != 6.0):print('第',i+1,"行,第1列数据有毛病")checkCmd = False#5、多层判断,检查第二列的数据是否匹配第一列的类型cmdValue = sheet1.row(i)[1]if cmdType.value ==1.0 or cmdType.value == 2.0 or cmdType.value == 3.0:#(0 空  1 字符串  2 数字  3 日期  4  布尔值 5 error)#6、当选项为1-3时,判断是否第二列为字符串if cmdValue.ctype != 1:print('第',i+1,"行,第2列数据有毛病")checkCmd = False#7、当模式为输入时,第二列值不能为空if cmdType.value == 4.0:if cmdValue.ctype == 0:print('第',i+1,"行,第2列数据有毛病")checkCmd = False#8 等待模式,必须为数字才可用if cmdType.value == 5.0:if cmdValue.ctype != 2:print('第',i+1,"行,第2列数据有毛病")checkCmd = False#9、滚轮事件,内容必须为数字if cmdType.value == 6.0:if cmdValue.ctype != 2:print('第',i+1,"行,第2列数据有毛病")checkCmd = Falsei += 1return checkCmddef mainWork(sheet1):pyautogui.FAILSAFE=False  #防止故障pyautogui.PAUSE =  2  #每步操作停顿时间#循环获取有效的行i = 1while i < sheet1.nrows:cmdType = sheet1.row(i)[0]#当输入1-3时,因为都是点击,获取图片坐标,直接操作即可if cmdType.value == 1.0 or  cmdType.value == 2.0 or cmdType.value == 3.0:#取图片名称img = sheet1.row(i)[1].value#获取图片在当前页面的坐标X,Y = ImageMatch.jietu(img)if cmdType.value == 1.0:pyautogui.click(X,Y)elif cmdType.value == 2.0:pyautogui.doubleClick(X,Y)elif cmdType.value == 3.0:pyautogui.rightclick(X,Y)#4 输入elif cmdType.value == 4.0:inputValue = sheet1.row(i)[1].valuepyperclip.copy(inputValue)pyautogui.hotkey("ctrl","v")pyautogui.hotkey("enter")#5等待elif cmdType.value == 5.0:waitTime = sheet1.row(i)[1].valuetime.sleep(waitTime)#6 滚轮elif cmdType.value == 6.0:scroll = sheet1.row(i)[1].valuepyautogui.scroll(int(scroll))i += 1
if __name__ == '__main__':#打开execl表file = "test.xlsx"##打开表wb = xlrd.open_workbook(file)#获取文件的某一个sheet页面sheet1 = wb.sheet_by_name("Sheet1")#数据检查checkCmd = dataCheck(sheet1)#主体程序mainWork(sheet1)

excel表模板

存在的缺陷

后面的步骤并不会等待前面的步骤执行成功,而是随着时间自动进行,没有错误修复机制,并且因为本身是模拟鼠标操作的,会占用鼠标不能做其他事情

关于pyinstaller打包的程序太大并且运行慢的解决方法

https://blog.csdn.net/m0_47472749/article/details/124426544

相关内容

热门资讯

有关先秦诸子百家的书 有关先秦诸子百家的书《论语》《道德经》《吕氏春秋》《韩非子》《孙子兵法》……
李寻欢为什么咳嗽 李寻欢为什么咳嗽容易引起女人的关爱.他有病啊 因为古龙希望他有病 而且还是咳嗽~就是给他刻化的...
兴业银锡相关公司新增一项190... (转自:快查一企业中标了)快查APP显示,兴业银锡相关公司赤峰宇邦矿业有限公司于2025年6月16日...
我的生日是每年的农历 6月7号... 我的生日是每年的农历 6月7号 那2021年阴历是多少号 麻烦好心人跟我说下?阴历和农历一样,都是六...
三达膜(688101.SH):... 2025年6月16日,三达膜(688101.SH)公告称,公司召开第五届董事会第六次会议,审议通过了...
拉卡拉:正在筹划H股上市事项 ... 中证智能财讯拉卡拉(300773)6月16日晚间公告,公司目前正在筹划境外发行股份(H股)并在香港联...
特朗普集团推出T1智能手机:售...   炒股就看金麒麟分析师研报,权威,专业,及时,全面,助您挖掘潜力主题机会! 财联社6月16日讯(...
德林控股发盈喜 预计年度溢利同... 观点网讯:6月16日,德林控股在香港公告,预计截至2025年3月31日止年度溢利同比增加约10.1%...
伊利、京东火速入局,“苏超”商... “苏超”的商业价值、文旅经济价值仍在持续释放。 202...
《河北日报》报道唐山丨新农人奏... 转自:唐山广播电视台唐山市推动青年在农村施展才华新农人奏响田野创业曲□ 河北日报记者 师源 王育民 ...
俄外交部:美方取消俄美双边磋商... 格隆汇6月16日|据央视,俄罗斯外交部发言人扎哈罗娃在回答媒体关于俄美磋商前景的提问时表示,截至目前...
5月70城房价同比降幅收窄,商... 21世纪经济报道记者李莎 北京报道 6月16日,国家统计局发布5月房地产数据。数据显示,5月70个大...
中国作协“作家活动周”启幕 聚... 转自:千龙网由中国作家协会主办的第12期“作家活动周”6月16日在京启幕,本期活动以“中国文学新力量...
今年全国节能宣传周聚焦“节能增... 转自:中国政府采购报【行业动态】今年全国节能宣传周聚焦“节能增效 焕‘新’引领”本报讯 国家发展改革...
这个是什么字?繁体的 这个是什么字?繁体的就是面条的那个面面粉的面,面球的面。面 miàn 就是由小麦磨成的粉
科技赋能 各地夏收夏种高效推进 眼下正值“三夏”时节,各地依托科技赋能,助力夏收夏种夏管提速增效。截至15日,山东小麦已收5600多...
美股异动|Meta盘初涨超3%... 格隆汇6月16日|Meta Platforms(META.US)盘初涨超3%。消息面上,Meta准备...
以色列军方说已摧毁伊朗约三分之... 来源:新华社新华社耶路撒冷6月16日电以色列国防军发言人埃菲·戴弗林16日发表声明说,自13日发动袭...
魔兽世界盗贼如何在战斗中隐身 魔兽世界盗贼如何在战斗中隐身魔兽世界盗贼如何在战斗中隐身,不是强隐。比如给致盲以后等一会就能隐身了是...
伤害不大但启示深刻 转自:中国政府采购报【行业观察】伤害不大但启示深刻——美的北美空调召回事件之政府采购观察■ 吴敏近日...