如何在pyautogui的locateOnScreen方法中指定多个搜索区域?
问题解答
一、pyautogui指定多个搜索区域的实现方法
pyautogui的locateOnScreen原生不支持同时传入多个region参数,你重复传参的写法不符合Python语法规则,所以会触发SyntaxError: keyword argument repeated: region报错。
正确的实现逻辑是:提前定义所有需要搜索的区域列表/字典,循环遍历每个区域,逐个调用locateOnScreen搜索即可。
二、你当前代码报错的原因
你遇到的文件读取报错和循环传递region参数没有关系,是两个代码错误导致的:
- 遍历字典逻辑错误:你写的
for region in regions遍历的是字典的键,也就是"region 1"、"region 2"这类字符串,而非你想要的坐标元组。把字符串传给region参数后,参数类型不匹配,触发了底层的读取异常。 - 变量命名冲突:你全局定义了变量
l存储图片路径,但函数名也叫l,函数内部还重复定义了变量l,触发了Python的变量遮蔽规则,导致读取图片时实际拿到的路径不对,才会出现找不到l.jpg的报错。
三、修正后的参考代码
import pyautogui as py # 提前定义图片路径,不要用单字母这种易冲突的变量名 levelup_img_path = r"C:\Users\x\OneDrive\froggy-pirate-master\avoidShips\eventfarm\l.jpg" # 定义搜索区域,直接用列表存元组更简洁 search_regions = [ (476, 268, 736, 320), (1328, 268, 1591, 320), (276, 745, 564, 806), (1130, 745, 1422, 803) ] def check_levelup(): for region in search_regions: # 逐个区域搜索 locate_res = py.locateOnScreen(levelup_img_path, confidence=0.90, region=region) if locate_res is not None: py.click(locate_res) # 找到后可以直接break结束循环,不需要继续搜剩下的区域 break
内容的提问来源于stack exchange,提问作者user9686961
相关产品推荐
相关产品推荐

