PyAutoGUI: 实现图像定位

1,932 阅读2分钟

最近我在整关于navicat的自动化操作,Navicat太不友好了,有些控件根本就不能用窗口定位控件。全局搜遍navicat的所有控件与窗口,它就是没有我想要的那个控件位置。而且Navicat有些窗口,是需要触发才会出现(比如说鼠标点击某个编辑框,它的窗口树才会出现这个子窗口)

需求还是要解决的,既然找不到窗口,那就换一个方法,用图像定位窗口的位置,然后通过坐标去触发这个控件。

又恰好,PyAutoGUI的locateCenterOnScreen能够实现这个需求

能够解决问题的方法都是好方法,先实现后续才能优化

本文说明

本文不会讲pyautogui的其他基本操作,只针对定位函数

安装

 pip install pyautogui

用法

locateCenterOnScreen(image, grayscale=True)

  • 返回image屏幕上中心的(x,y)坐标
  • grayscale =True:给函数提供轻微的加速,它使图像失去颜色饱和,从而达到快速定位,不过也容易定位不精准

先看个例子

 import pyautogui
 # 定位图片在屏幕中的坐标位置
  point = pyautogui.locateCenterOnScreen('sample.png')
 # 点击图片坐标
 pyautogui.click(point)
 # 输出坐标
 print(point)
 # 结果: Point(x=112,y=114)

这个方法有一个弊端就是,在复杂的窗口里面,需要精准根据图片定位,会花一定的时间,而且当它找不到图片所在坐标时,它会返回一个None值,

locateOnScreen(image, grayscale=False)

  • 返回image上的坐标(left,top, width, height)
 import pyautogui
 ​
 point = pyautogui.locateOnScreen('simple.png',grayscale=False)
 print(point)
 # Box(left=120,top=500,width=56,height=36)
 print(point[0])
 # 120
 print(point.left)
 # 120

其他

如果我得到图片坐标并不是最终目标,而是图片的偏离一段距离的坐标呢?或许你会问,为什么不直接定位目标图片坐标呢,哈哈哈我就是这么刁钻

不过还是有解决办法的,例子如下:

 import pyautogui
 ​
 pic_point = puautogui.locateCenterOnScreen('simple.png')
 print(pic_point)
 # Point(x=100,y=100)
 x = pic_point.x + 100
 y = pic_point.y + 100
 print(x, y)
 # 200 200
 # 最后点击目标坐标
 pyautogui.click(x=x,y=y)

没了

就讲到这里吧,如果后续有新增的方法,那就下次再改

\