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

使用pyautogui做图像识别时如何设置条件为True以终止循环

问题原因
  • 核心逻辑错误:imageFind函数返回值为识别到的坐标元组(a, b),不属于布尔类型,不可能与True相等,因此if image_find == True条件永远不触发,计数器counter不会被置0,死循环持续运行。
  • 冗余逻辑:imageFind函数内部已经实现了「识别不到图像就一直循环等待」的逻辑,只要函数执行完成并返回结果,就说明图像已经识别成功,不需要额外判断识别状态。
  • 重复调用:你当前的主逻辑在识别到图像后又二次调用了imageFind,属于不必要的重复操作,不符合你「识别到图像就终止循环」的需求。
修复方案

你要实现「识别到Edge图标后,在点击前终止循环,点击动作正常执行」的需求,可以按以下代码修改:

import pyautogui as p
import time
import random
import os
import pygame
from hashlib import sha256

def search(query):
    p.hotkey("ctrl","e")
    time.sleep(.1)
    p.write(query)
    p.press("enter")
    time.sleep(.67)

def imageFind(image,g,double):
    a = 0
    b = 0
    while(a==0 and b==0):
        try:
            a,b = p.locateCenterOnScreen(image,grayscale=g)
        except TypeError:
            pass
    # 识别成功就直接返回坐标,点击动作放到主逻辑执行,方便提前终止循环
    return a,b

#p.hotkey("win","d")
counter = 1
while counter == 1:
    # 仅调用一次识别函数,返回就说明识别成功
    x, y = imageFind("Edge.png",False,False)
    # 识别成功立刻终止循环
    counter = 0
    # 终止后再执行点击动作,符合你要求的"点击前终止循环"的逻辑
    p.click(x,y)
    # 如果需要双击就替换为p.doubleClick(x,y)
验证识别成功的方法

如果你需要单独判断识别是否成功,可以把imageFind函数内部的死循环去掉,改成单次识别,返回布尔状态+坐标,示例如下:

# 单次识别版本的函数,不需要内置死循环
def imageFindOnce(image,g):
    try:
        a,b = p.locateCenterOnScreen(image,grayscale=g)
        # 识别成功返回True和坐标
        return True, (a,b)
    except TypeError:
        # 识别失败返回False和空值
        return False, None

# 主逻辑调用示例
counter = 1
while counter == 1:
    find_flag, pos = imageFindOnce("Edge.png", False)
    if find_flag:
        counter = 0
        p.click(pos[0], pos[1])
    # 识别失败可以加短暂休眠降低CPU占用
    time.sleep(0.1)

内容的提问来源于stack exchange,提问作者theshape

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 06:24:04