Python自动化脚本异常:调用att()后陷入重复点击死循环
问题分析与解决方案
核心问题
- att()函数陷入重复操作:函数内嵌套遍历像素时,找到目标RGB(155,15,19)后没有终止循环,会持续对同一个像素位置重复执行点击操作,因为外层的for循环不会自动停止。
- 主循环逻辑错误:逐个像素判断是否存在战斗标记RGB(0,255,0),只要有一个像素不符合就调用att(),导致att()被频繁触发,且一旦进入att()的遍历循环就无法回到主循环。
修复后的代码
1. 修复att()函数
找到目标颜色后立即完成点击并退出函数,避免重复操作:
def att(): s = pyautogui.screenshot() for x in range(68, 1690, 5): for y in range(140, 975, 5): r,g,b = s.getpixel((x,y)) if (r,g,b) == (155,15,19): print('attacking') pyautogui.moveTo(x, y) pyautogui.click(x, y) sleep(3) return # 找到目标后立即退出函数,终止遍历
2. 修复主循环逻辑
先整体检测区域内是否存在战斗标记,只有完全不存在时才调用att(),避免逐个像素判断导致的频繁调用:
while True: openinvo() lowhp = pyautogui.locateCenterOnScreen('lowhp.JPG', region=(0, 0, 1920, 1080), confidence=0.85) if lowhp is None: heal() # 先检测整个区域是否存在战斗标记(0,255,0) in_combat = False s1 = pyautogui.screenshot() for x1 in range(68, 1690, 5): for y1 in range(140, 975, 5): r1,g1,b1 = s1.getpixel((x1,y1)) if (r1,g1,b1) == (0,255,0): in_combat = True break # 找到战斗标记,停止内层遍历 if in_combat: break # 找到战斗标记,停止外层遍历 if in_combat: print('in combat') sleep(0.3) else: print('test') att() sleep(0.3) if keyboard.is_pressed("q"): break
额外优化建议
- 减少截图频率:频繁截图会占用系统资源,可以根据实际场景调整截图的时机和区域范围。
- 调整遍历步长:原代码步长为5已做优化,若追求更快检测速度,可适当增大步长值。
- 添加超时机制:在att()中可添加超时判断,避免长时间找不到目标时一直处于遍历状态。
内容的提问来源于stack exchange,提问作者willy smith
相关产品推荐
相关产品推荐

