Topic: Errore TypeError: cannot unpack non-iterable NoneType object  (Letto 69 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline chri16

  • python unicellularis
  • *
  • Post: 2
  • Punti reputazione: 0
    • Mostra profilo
Salve sono un nuovo utente, cercando su internet ho trovato questo forum e dopo varie ricerche inutili ho deciso di chiedere aiuto qui.
Ho un problema con uno script che ho realizzato io, questo è il seguente errore preso dalla shell:

Traceback (most recent call last):
  File "C:\Users\chris\Desktop\test\test.py", line 58, in <module>
    x,y = pyautogui.locateCenterOnScreen('6.png', confidence=0.9)
TypeError: cannot unpack non-iterable NoneType object

il seguente errore avviene dopo vari cicli dello script e non prima, qualche idea?

codice python:


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

time.sleep(3)

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

while keyboard.is_pressed('q') == False:
    time.sleep(0.5)
    if pyautogui.locateOnScreen('1.png', confidence=0.9) != None:
        x,y = pyautogui.locateCenterOnScreen('1.png', confidence=0.9)
        click(x,y)
        time.sleep(0.5)
    else:
        print("error 1")
        time.sleep(0.5)
    time.sleep(0.5)
    if pyautogui.locateOnScreen('2.png', confidence=0.9) != None:
        x,y = pyautogui.locateCenterOnScreen('2.png', confidence=0.9)
        click(x,y)
        time.sleep(0.5)
    else:
        print("error 2")
        time.sleep(0.5)
    time.sleep(0.5)   
    if pyautogui.locateOnScreen('3.png', confidence=0.9) != None:
        x,y = pyautogui.locateCenterOnScreen('3.png', confidence=0.9)
        click(x,y)
        time.sleep(0.5)
    else:
        print("error 3")
        time.sleep(0.5)
    time.sleep(0.5)   
    if pyautogui.locateOnScreen('4.png', confidence=0.9) != None:
        x,y = pyautogui.locateCenterOnScreen('4.png', confidence=0.9)
        click(x,y)
        time.sleep(0.5)
    else:
        print("error 4")
        time.sleep(0.5)
    time.sleep(0.5)   
    if pyautogui.locateOnScreen('5.png', confidence=0.9) != None:
        x,y = pyautogui.locateCenterOnScreen('5.png', confidence=0.9)
        click(x,y)
        time.sleep(0.5)
    else:
        print("error 5")
        time.sleep(0.5)
    time.sleep(0.5)
    if pyautogui.locateOnScreen('6.png', confidence=0.9) != None:
        x,y = pyautogui.locateCenterOnScreen('6.png', confidence=0.9)
        click(x,y)
        time.sleep(0.5)
    else:
        print("error 6")
        time.sleep(0.5)
    time.sleep(0.5)
    if pyautogui.locateOnScreen('7.png', confidence=0.9) != None:
        x,y = pyautogui.locateCenterOnScreen('7.png', confidence=0.9)
        click(x,y)
        time.sleep(0.5)
    else:
        print("error 7")
        time.sleep(0.5)
    continue


grazie in anticipo :ok:

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.144
  • Punti reputazione: 9
    • Mostra profilo
Re:Errore TypeError: cannot unpack non-iterable NoneType object
« Risposta #1 il: Novembre 20, 2020, 18:29 »
eh... ti tocca debuggare...
probabilmente ci sono delle situazioni in cui locateCenterOnScreen restituisce None anche se "subito prima" il check locateOnScreen era passato... Il mio istinto mi dice che qui "subito prima" è un concetto relativo, perché quelle funzioni possono richiedere parecchio tempo a essere eseguite, specie su macchine non proprio performanti. Magari succede che tra il primo e il secondo test, l'immagine sparisce (perché è coperta da qualcos'altro, metti).
Del resto, debugging a parte, non ha proprio senso fare due test uguali in successione. Chiedi direttamente locateCenterOnScreen ed elimina tutti i locateOnScreen.

Offline chri16

  • python unicellularis
  • *
  • Post: 2
  • Punti reputazione: 0
    • Mostra profilo
Re:Errore TypeError: cannot unpack non-iterable NoneType object
« Risposta #2 il: Novembre 20, 2020, 19:25 »
Grazie mille del consiglio, oltre al togliere uno dei due locate ho anche tolto tutti i doppi time.sleep di cui mi ero dimenticato, per assurdo mi è venuto di provare un metodo diverso dal if cercando di risolvere il problema e ho effettivamente risolto il problema prendendomi cura dell'errore stesso, in questo modo:


    try:
        x,y = pyautogui.locateCenterOnScreen('1.png', confidence=0.9)
        click(x,y)
    except TypeError:
        print("error 1")

    time.sleep(0.5)