IndexError: list out of range in a while loop
IndexError: list out of range in a while loop
所以当我需要更改代码中以下代码的位置时,我正在编辑我的大型自动化脚本。将代码放在脚本的上部位置后,我突然开始收到以下错误:
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------------
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)
请在循环中查看您的材料。你应该从那里学到这些技巧。
首先,我强烈建议更新您的 sleep() 方法以使用知道您的点击是否已加载的等待方法。在不同的服务区和 wifi 区,您的网络并不总是超快或超慢,因此隐式等待某些内容加载将确保您不会在某些内容尚未完成执行之前继续前进。
其次,为什么不直接使用 for 循环?这样你就不需要跟踪指数了。
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------------
所以当我需要更改代码中以下代码的位置时,我正在编辑我的大型自动化脚本。将代码放在脚本的上部位置后,我突然开始收到以下错误:
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------------
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)
请在循环中查看您的材料。你应该从那里学到这些技巧。
首先,我强烈建议更新您的 sleep() 方法以使用知道您的点击是否已加载的等待方法。在不同的服务区和 wifi 区,您的网络并不总是超快或超慢,因此隐式等待某些内容加载将确保您不会在某些内容尚未完成执行之前继续前进。
其次,为什么不直接使用 for 循环?这样你就不需要跟踪指数了。
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------------