首页 > 解决方案 > 发生异常:TypeError 无法解压不可迭代的 NoneType 对象

问题描述

我正在研究一个 python 机器人,旨在为点击游戏自动切换鼠标位置,但我一直随机收到此错误。我认为每次运行 while 命令时都给它一个值会修复它,但它没有显示任何改进。从我使用该程序所看到的情况来看,如果它扫描并且没有找到它试图定位的 2 个图像中的任何一个。

错误信息:

Exception has occurred: TypeError
cannot unpack non-iterable NoneType object
  File "C:\Users\gpetr\Desktop\New folder (3)\program.py", line 21, in <module>
    px, py = eyeloc

代码如下图:

from pyautogui import *
import pyautogui
import time
import keyboard
import random
import win32api, win32con

def click(x,y):
    win32api.SetCursorPos((x,y))
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,0,0)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,0,0)

eyeloc = 997, 456

while keyboard.is_pressed('q') == False:
    eyeloc = 997, 456
    if pyautogui.locateOnScreen('pink.png', region=(576, 160, 842, 592), confidence=0.8)  != None:
        eyeloc = pyautogui.locateCenterOnScreen('pink.png', region=(576, 160, 842, 592), confidence=0.8)
        print("pink")
        px, py = eyeloc  
        pyautogui.moveTo(px, py+130, 0.2)
        time.sleep(0.4)
    elif pyautogui.locateOnScreen('gold.png', region=(576, 160, 842, 593), confidence=0.8)  != None:
        eyeloc = pyautogui.locateCenterOnScreen('gold.png', region=(576, 160, 842, 592), confidence=0.8)
        print("gold")
        gx, gy = eyeloc
        pyautogui.moveTo(gx, gy+130, 0.2)
        time.sleep(0.4)     

标签: pythonpython-3.x

解决方案


我添加了一个名为 eyelocc 的 eyeloc 副本,它在 while 命令之外被赋予了一个值。如果我添加的话,在第一个里面

if eyeloc == None:
    eyeloc = eyelocc

在第一次结束时,如果 eyelocc 取 eyeloc 的值,以便下一次 eyeloc 等于 none 时,它​​将接收它的最后一个可用值。我运行该程序大约 10 分钟,没有遇到任何问题。代码的最终草案如下所示:

from pyautogui import *
import pyautogui
import time
import keyboard
import random
import win32api, win32con

eyelocc = 997, 456

while keyboard.is_pressed('q') == False:
    if pyautogui.locateOnScreen('pink.png', region=(576, 160, 842, 592), confidence=0.8)  != None:
        eyeloc = pyautogui.locateCenterOnScreen('pink.png', region=(576, 160, 842, 592), confidence=0.8)
        if eyeloc == None:
            eyeloc = eyelocc
        px, py = eyeloc
        pyautogui.moveTo(px, py+130, 0.2)
        time.sleep(0.4)
        eyelocc = eyeloc
    elif pyautogui.locateOnScreen('gold.png', region=(576, 160, 842, 593), confidence=0.8)  != None:
        eyeloc = pyautogui.locateCenterOnScreen('gold.png', region=(576, 160, 842, 592), confidence=0.8)
        if eyeloc == None:
            eyeloc = eyelocc
        gx, gy = eyeloc
        pyautogui.moveTo(gx, gy+130, 0.2)  
        time.sleep(0.4)    
        eyelocc = eyeloc

推荐阅读