IndexError: список вне диапазона в цикле while - PullRequest
0 голосов
/ 01 ноября 2019

Итак, я редактировал свой большой скрипт автоматизации, когда мне нужно было изменить место в коде для следующего кода. Поместив код в верхнюю позицию скрипта, я неожиданно начал получать следующую ошибку:

  File "C:\Users\User\Desktop\clicker.py", line 198, in <module>
    while a[i] != None:
IndexError: list index out of range  

Я попытался проверить индексы, но они выглядят нормально. Я понятия не имею, как отлаживать это дальше .. Что странно, ошибка отображается в конце цикла while (я знаю, как ее исправить, если она будет показана только в начале). Это означает, что каждая обнаруженная координата в списке выполняется, и она терпит неудачу в самом конце, когда больше не существует координат. Мой код:

 # convert broken xls to working xlsx
    pyautogui.click(x=75, y=746)
    sleep(1)
    pyautogui.click(pyautogui.locateCenterOnScreen('C:/Users/User/Documents/Clicker/downloads.png'))
    sleep(3)
    a = list(pyautogui.locateAllOnScreen('C:/Users/User/Documents/Clicker/excel.png'))
    i=0
    while a[i] != None:
        x, y = pyautogui.center(a[i])
        pyautogui.click(x, y, clicks=2)
        sleep(4)
        pyautogui.click(pyautogui.locateCenterOnScreen('C:/Users/User/Documents/Clicker/yes.png'))
        sleep(2.5)
        try:
            pyautogui.click(pyautogui.locateCenterOnScreen('C:/Users/User/Documents/Clicker/editing.png'))
        except TypeError:
            print("No need to press editing mode")
        # click file
        pyautogui.click(x=29, y=50)
        sleep(1)
        # click save as
        pyautogui.click(x=50, y=312)
        sleep(1)
        # click on drop down menu
        pyautogui.click(x=814, y=177)
        sleep(2)
        # select .xlsx
        pyautogui.click(x=814, y=200)
        sleep(1)
        # click save
        pyautogui.click(x=920, y=170)
        sleep(2)
        # close excel
        pyautogui.click(x=997, y=14)
        sleep(2)
        i+=1
    #-----EXCEL------------

Ответы [ 2 ]

3 голосов
/ 01 ноября 2019
while a[i] != None:
    x, y = pyautogui.center(a[i])

Вместо этого используйте

for i in range(len(a)):
    x, y = pyautogui.center(a[i])

Или, поскольку вы не используете i для чего-либо еще,

for item in a:
    x, y = pyautogui.center(item)

Пожалуйста, просмотрите ваши материалы на петлях. Вы должны были взять эти методы оттуда.

1 голос
/ 01 ноября 2019

Прежде всего, я настоятельно рекомендую обновить методы sleep (), чтобы использовать методы ожидания, которые знают, загружены ли ваши клики. В разных зонах обслуживания и зонах Wi-Fi ваша сеть не всегда работает очень быстро или медленно, и поэтому неявное ожидание загрузки чего-либо гарантирует, что вы не будете двигаться дальше, пока что-то не завершится.

Во-вторых, почемуне просто использовать цикл? Таким образом, вам не нужно отслеживать индексы.

pyautogui.click(x=75, y=746)
sleep(1)
pyautogui.click(pyautogui.locateCenterOnScreen('C:/Users/User/Documents/Clicker/downloads.png'))
sleep(3)
a = list(pyautogui.locateAllOnScreen('C:/Users/User/Documents/Clicker/excel.png'))
for item in a:
    x, y = pyautogui.center(item)
    pyautogui.click(x, y, clicks=2)
    sleep(4)
    pyautogui.click(pyautogui.locateCenterOnScreen('C:/Users/User/Documents/Clicker/yes.png'))
    sleep(2.5)
    try:
        pyautogui.click(pyautogui.locateCenterOnScreen('C:/Users/User/Documents/Clicker/editing.png'))
    except TypeError:
        print("No need to press editing mode")
    # click file
    pyautogui.click(x=29, y=50)
    sleep(1)
    # click save as
    pyautogui.click(x=50, y=312)
    sleep(1)
    # click on drop down menu
    pyautogui.click(x=814, y=177)
    sleep(2)
    # select .xlsx
    pyautogui.click(x=814, y=200)
    sleep(1)
    # click save
    pyautogui.click(x=920, y=170)
    sleep(2)
    # close excel
    pyautogui.click(x=997, y=14)
    sleep(2)
#-----EXCEL------------
...