Python使用pyautogui编写复选框点击脚本时,while循环报错TypeError: 'NoneType' object is not subscriptable及循环退出问题
解决PyAutoGUI点击复选框后退出循环的TypeError问题
嘿,我来帮你搞定这个问题!你遇到的TypeError: 'NoneType' object is not subscriptable其实是个很常见的逻辑顺序问题,咱们一步步拆解:
为啥会报错?
当所有复选框都被点完之后,pyautogui.locateOnScreen("checkbox.png")找不到目标图片了,会返回None。但你现在的代码是直接把这个返回值传给pyautogui.center()——而center()函数需要的是一个包含坐标的元组(比如(x, y, width, height)),对着None做下标操作肯定会炸呀!
而且你的退出判断if x1 == None: break放在了点击操作之后,这时候错误已经发生了,根本没机会走到判断步骤就崩溃了。
怎么修复?
核心就是先检查有没有找到目标,再执行后续的点击操作,具体改法如下:
修改后的完整代码
import pyautogui import PIL pyautogui.sleep(2) while True: # 第一步:先定位复选框,不要直接取中心点 checkbox_position = pyautogui.locateOnScreen( "checkbox.png", region=(50, 50, 1000, 1000), confidence=0.9 ) # 第二步:判断是否找到目标,找不到就退出循环 if checkbox_position is None: break # 第三步:找到目标后再取中心点,执行点击 x1 = pyautogui.center(checkbox_position) pyautogui.moveTo(x1) pyautogui.click() # 这里的sftp变量你没用到,要是不需要可以删掉哦 sftp = pyautogui.locateOnScreen("sftp.png", region=(750, 450, 500, 500), confidence=0.7) pyautogui.sleep(0.5) print(x1) print("work is done")
几个小建议
- 用
is None代替== None来判断空值,这是Python社区的最佳实践,逻辑更严谨 - 代码里的
sftp变量定义后没使用,要是没后续逻辑可以删掉,减少冗余 - 如果你的PyAutoGUI版本支持,可以给
locateOnScreen加个timeout参数,避免程序一直无意义地等待
内容的提问来源于stack exchange,提问作者goni
相关产品推荐
相关产品推荐

