使用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
相关产品推荐
相关产品推荐

