如何替换大量if语句提升PyAutoGUI表单自动填充脚本运行速度?
优化PyAutoGUI表单自动填充脚本的效率
你的脚本运行缓慢的核心原因是重复全屏幕像素扫描:上百条独立的locateOnScreen调用会反复遍历整个屏幕,加上代码冗余,导致资源浪费严重。以下是几个针对性的优化方案,能大幅提升执行效率:
1. 用问题-答案映射表替代批量if判断
把所有问题图和对应答案图整理成键值对,遍历一次即可找到当前显示的问题,避免逐个调用屏幕扫描:
import pyautogui # 全局调整延迟(根据系统稳定性自行调整) pyautogui.PAUSE = 0.05 # 定义问题与答案的对应关系,扩展到你的上百条条目 qa_pairs = [ ("q1.png", "r1.png"), ("q2.png", "r2.png"), ("q3.png", "r3.png"), ("q4.png", "r4.png"), # ... 剩余条目 ] # 预定位重复点击的元素(位置固定时使用,避免重复扫描) check_pos = pyautogui.locateCenterOnScreen("check.png", confidence=0.8) continue_pos = pyautogui.locateCenterOnScreen("continue.png", confidence=0.8) # 初始点击 pyautogui.click(1098, 433) # 遍历查找当前显示的问题,找到后立即执行操作并退出循环 for q_img, r_img in qa_pairs: # 缩小扫描范围(替换成你的表单实际区域) q_loc = pyautogui.locateOnScreen(q_img, region=(500, 300, 800, 600), confidence=0.8) if q_loc: # 点击对应答案 pyautogui.click(r_img, button="left", _pause=False) # 使用预定位的坐标点击重复元素 if check_pos: pyautogui.click(check_pos, _pause=False) if continue_pos: pyautogui.click(continue_pos, _pause=False) break # 找到当前问题后停止遍历,避免多余扫描
2. 关键优化细节
缩小扫描区域
通过region参数限定扫描范围(格式:(x, y, 宽度, 高度)),只扫描表单所在的屏幕区域,能将扫描速度提升数倍。你可以用pyautogui.displayMousePosition()获取表单区域的坐标。
启用置信度匹配
安装opencv-python后,使用confidence参数允许非精确匹配,既提升速度又增强鲁棒性:
pip install opencv-python
预加载固定元素坐标
像check.png、continue.png这类位置固定的元素,提前定位一次,后续直接使用坐标点击,避免每次操作都重新扫描屏幕。
降低不必要的延迟
通过pyautogui.PAUSE全局调整延迟,或在单个操作中用_pause=False关闭延迟(注意平衡速度与稳定性)。
3. 进阶优化:批量扫描所有问题
如果需要同时处理多个问题(或不确定当前显示哪一个),可以用locateAllOnScreen一次性扫描所有匹配的问题图,再批量处理:
form_region = (500, 300, 800, 600) # 一次性获取所有显示的问题 all_q = pyautogui.locateAllOnScreen(list(dict(qa_pairs).keys()), region=form_region, confidence=0.8) qa_dict = dict(qa_pairs) for q_loc in all_q: # 截取问题图区域的像素,匹配对应的文件名 q_screenshot = pyautogui.screenshot(region=q_loc) for q_img, r_img in qa_dict.items(): if pyautogui.locateOnScreen(q_img, image=q_screenshot, confidence=0.9): # 执行点击操作 pyautogui.click(r_img) if check_pos: pyautogui.click(check_pos) if continue_pos: pyautogui.click(continue_pos) break
内容的提问来源于stack exchange,提问作者Freynes
相关产品推荐
相关产品推荐

