PyAutoGUI.locateOnScreen在Linux下行为异常:循环查找失效求助
解决Pop OS 22.04下PyAutoGUI循环查找屏幕元素抛出异常的问题
问题根源
PyAutoGUI在不同操作系统下的默认行为存在差异:Windows环境中locateOnScreen找不到目标时会返回None,但Linux(如Pop OS 22.04)环境下,它会直接抛出ImageNotFoundException,导致你的循环提前终止,无法持续查找目标元素。
修复方案
你可以通过两种方式让函数在Linux下持续循环查找:
方案1:捕获ImageNotFoundException异常
修改函数,在每次调用locateOnScreen时捕获异常,找不到目标时重置loc为None并继续循环:
import pyautogui def __clicks_print(area, *print_names, nclicks=1): loc = None while not loc: for print_name in print_names: try: loc = pyautogui.locateOnScreen(print_name, region=area) print(loc) if loc: break except pyautogui.ImageNotFoundException: loc = None continue pyautogui.moveTo(loc) pyautogui.click(clicks=nclicks)
方案2:设置raiseException=False参数
如果你的PyAutoGUI版本支持,可以直接在locateOnScreen中添加raiseException=False参数,让找不到目标时返回None而非抛出异常:
import pyautogui def __clicks_print(area, *print_names, nclicks=1): loc = None while not loc: for print_name in print_names: loc = pyautogui.locateOnScreen(print_name, region=area, raiseException=False) print(loc) if loc: break pyautogui.moveTo(loc) pyautogui.click(clicks=nclicks)
优化建议
为避免循环占用过高CPU,可在每次循环后添加短暂延迟:
import pyautogui import time def __clicks_print(area, *print_names, nclicks=1): loc = None while not loc: for print_name in print_names: try: loc = pyautogui.locateOnScreen(print_name, region=area) print(loc) if loc: break except pyautogui.ImageNotFoundException: loc = None continue time.sleep(0.5) # 每次循环暂停0.5秒 pyautogui.moveTo(loc) pyautogui.click(clicks=nclicks)
内容的提问来源于stack exchange,提问作者Milton Ventura
相关产品推荐
相关产品推荐

