pyautogui的locateAllOnScreen返回列表如何移除已处理的盒子元素
解决方法
直接给你改好的代码,核心优化了三个点:
- 把
locateAllOnScreen返回的生成器转成可变列表,支持动态移除已处理的盒子 - 给单个盒子加了循环点击逻辑,直到检测到绿色再停止
- 所有颜色检测都限定在当前盒子的区域内,不用全局扫屏幕,效率提升非常明显
完整可运行代码
import pyautogui as pg import time import pydirectinput # 提前配置所有状态对应的截图路径,后续改需求直接改这里就行 # 注意:所有颜色截图建议只截取盒子显色的核心区域,不要带多余背景,检测精度会更高 NEED_CLICK_COLORS = ['red.png', 'orange.png', 'blue.png', 'white.png', 'brown.png', 'black.png'] FINISHED_COLOR = 'green.png' if pg.locateOnScreen('box.png', confidence=0.9): # 转成可变列表,后续可以移除已处理的盒子 box_list = list(pg.locateAllOnScreen('box.png', confidence=0.9)) # 倒序遍历,移除元素不会打乱剩余元素的下标,避免漏处理 for index in range(len(box_list) - 1, -1, -1): current_box = box_list[index] pg.moveTo(current_box) time.sleep(0.2) # 内层循环:点击当前盒子直到变绿 while True: # 先判断是否已经变绿,变绿就结束当前盒子的处理 if pg.locateOnScreen(FINISHED_COLOR, region=current_box, confidence=0.95): break # 检查是否是需要点击的颜色,是就点击 for color_img in NEED_CLICK_COLORS: if pg.locateOnScreen(color_img, region=current_box, confidence=0.95): pg.click() # 点击后延迟可以根据游戏的显色响应速度自行调整 time.sleep(0.2) break # 处理完成,从列表移除当前盒子,永远不会再重复检测 box_list.pop(index)
额外说明
如果你的游戏里盒子会动态刷新出现新的,只需要在外层套一个死循环,定期识别新的盒子加入box_list即可,已经处理过的盒子不会重复进入处理逻辑。
内容的提问来源于stack exchange,提问作者NanoForger
相关产品推荐
相关产品推荐

