You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

pyautogui的locateAllOnScreen返回列表如何移除已处理的盒子元素

解决方法

直接给你改好的代码,核心优化了三个点:

  1. 把locateAllOnScreen返回的生成器转成可变列表,支持动态移除已处理的盒子
  2. 给单个盒子加了循环点击逻辑,直到检测到绿色再停止
  3. 所有颜色检测都限定在当前盒子的区域内,不用全局扫屏幕,效率提升非常明显

完整可运行代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 18:57:02