调用PIL.grab、load的多线程游戏bot运行一次后退出问题求助
修复方案
根因分析
代码的核心问题是线程run方法的try块末尾写了return x, y语句:一旦成功识别到游戏界面,执行到return就会直接终止run方法,线程随之退出,所以逻辑只会执行一次。未识别到界面时会抛出异常进入except分支,不会走到return,因此循环能持续运行。
此外代码还有两个可优化的问题:
- 空
except会捕获所有类型的异常,会吞掉代码运行时的其他报错,不利于后续排查问题 - 循环没有添加延迟,会持续高频执行,占用大量CPU资源
修复后的完整代码
import pyautogui from pyautogui import locateCenterOnScreen, press, release from PIL import ImageGrab from time import sleep from threading import Thread # 如果你用的pyautogui版本较低找不到ImageNotFoundException,可以删掉该导入,直接用except Exception即可 from pyautogui import ImageNotFoundException class POT(Thread): def __init__(self): Thread.__init__(self) self.running = True def run(self): while self.running: try: x, y = locateCenterOnScreen('menu.PNG') img = ImageGrab.grab().load() text = img[x - 670, y - 730] text2 = img[x - 757, y - 730] if text[0] < 150: for z in range(3): press('0') sleep(0.05) release('0') sleep(0.05) print('HP USED') if text2[0] < 150: for z in range(3): press('6') sleep(0.025) release('6') sleep(0.025) press('5') sleep(0.033) release('5') sleep(0.033) print('INTUITION USED 6') print('AURA USED 5') print(x, y) except ImageNotFoundException: print("GAME SCREEN NOT FOUND...") # 每次循环后添加延迟,单位秒,可根据需求调整 sleep(0.1) bot=POT() bot.start() bot.join()
关键改动说明
- 删除了
try块末尾的return x, y语句,保证while循环可以持续执行 - 统一只调用一次
grab()截图,避免重复截图导致的坐标偏移和性能浪费 - 替换空
except为具体的异常捕获,避免吞掉其他运行时报错 - 循环末尾添加固定延迟,降低CPU占用
- 移除不必要的全局变量声明,x、y改为局部变量使用更安全,如果需要外部访问可以改为
self.x、self.y存为实例属性
内容的提问来源于stack exchange,提问作者Mr Z
相关产品推荐
相关产品推荐

