最近我在整关于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)
没了
就讲到这里吧,如果后续有新增的方法,那就下次再改
\