Python pyautogui脚本中avoidLog函数每次点击触发2-3次是什么原因
问题原因分析
- 日志调用时机前置:你当前将
avoidLog()放在像素颜色校验之前,只要匹配到a.jpg、image_list内的图片、e.jpg三个条件,就会立刻写入日志,不需要等到后续像素校验通过、执行点击。如果像素校验不通过,本次循环不会执行点击,但日志已经被写入。 - 循环跳出范围不足:代码里的
break仅能跳出当前for image in image_list的遍历循环,无法终止外层的while True死循环。如果匹配到的三张图还停留在屏幕上没有消失,下一轮while循环又会重新执行匹配逻辑,再次触发日志写入,直到某次像素校验通过、点击后界面发生变化,匹配不到对应图片才会停止。 - 多图匹配重复触发:如果
image_list中有多张图片同时被屏幕匹配到,每一张匹配到的图片都会走一遍逻辑触发avoidLog(),直到某次走到break才会终止遍历,此时前面匹配到的图片已经产生了多条日志。
修复方案
- 将
avoidLog()的调用移动到像素校验通过后、点击操作前,保证只有确认要执行点击的时候才写入日志 - 点击完成后添加状态标记,跳出外层
while循环的当前轮次,同时添加足够的冷却等待时间,等待界面跳转后再执行下一轮检测 - 匹配到符合条件的图片后直接终止遍历,避免重复触发
修正后的参考代码:
import pyautogui as py def avoidLog(): avoidLog = open('Avoided.txt', 'a') avoidLog.write("Found at: " + str(f) + " at: " + str(skipTime)) avoidLog.write("\n") avoidLog.close() image_list = [] # 替换为你实际的坐标和校验色值 x = 你的实际x坐标 y = 你的实际y坐标 target_rgb = (你的r值, 你的g值, 你的b值) while True: is_clicked = False if py.locateOnScreen('a.jpg') is not None: for image in image_list: found = py.locateCenterOnScreen(image) if found is not None: skipTrigger = py.locateOnScreen('e.jpg') if skipTrigger is not None: py.moveTo(x, y) color_valid = py.pixelMatchesColor(x,y, target_rgb) if color_valid: # 日志仅在校验通过、确认要点击时调用 avoidLog() py.sleep(2) print("click") py.click() is_clicked = True break # 终止image遍历循环 # 点击完成后等待界面刷新,避免下一轮循环重复识别 if is_clicked: py.sleep(3)
内容的提问来源于stack exchange,提问作者user9686961
相关产品推荐
相关产品推荐

