Python3 "If" 没有捕捉到正在检查的内容
Python3 "If" not catching what it is checking
我已经查看了其他问题,例如 (Python 'if x is None' not catching NoneType),但我没有发现这些信息对我的场景有用。
import pyautogui
##########################
#This is a looping routine to search for the current image and return its coordinates
##########################
def finder(passedImage, workSpace): #start the finder func
print (passedImage) #print the image to be found
currentImage = pyautogui.locateOnScreen(passedImage,region=(workSpace), grayscale=True) #search for the image on the screen
if currentImage == None: # if that initial search goes "none" ...
print ("Looking") #Let us know we are looking
finder(passedImage,workSpace) #go and do the function again
print(currentImage) #print out the coordinates
currentImageX, currentImageY = pyautogui.center(currentImage) #get the X and Y coord
pyautogui.click(currentImageX, currentImageY) #use the X and Y coords for where to click
print(currentImageX, currentImageY) #print the X and Y coords
脚本的想法很简单。它只是找到图像的坐标,然后使用 pyautogui 库单击它(模块?对我来说是新术语)
除 "if currentImage == None:" 位外,一切正常。
它有时会在 currentImage 为 None 时捕获,然后适当地重新运行该函数以获取它,但有时它不会。我似乎无法找到它背后的任何韵律或原因,有时有效,有时无效。
任何关于我如何检查 None 然后回应存在 None 的建议都很棒 :)
抛出的示例错误如下:
Traceback (most recent call last):
File "fsr_main_001.py", line 57, in <module>
newItem()
File "fsr_main_001.py", line 14, in newItem
finder.finder(passedImage,workSpace)
File "/home/tvorac/python/formAutomation/finder.py", line 14, in finder
currentImageX, currentImageY = pyautogui.center(currentImage) #get the X and Y coord
File "/usr/local/lib/python3.5/dist-packages/pyscreeze/__init__.py", line 398, in center
return (coords[0] + int(coords[2] / 2), coords[1] + int(coords[3] / 2))
TypeError: 'NoneType' object is not subscriptable
我认为发生的事情是当你说你重新运行这个函数时,你是在递归地这样做。新调用 finder
后没有 return
:
if currentImage == None: # if that initial search goes "none" ...
print ("Looking") #Let us know we are looking
finder(passedImage,workSpace) #go and do the function again
print(currentImage) #print out the coordinates
一旦 finder()
调用完成它的工作,控制 returns 到 currentImage
是 None
的函数实例,它继续打印, pyautogui.center
等等。
考虑到这可能会导致一些相当深的递归,它可能不是查找图像的最佳方法。相反,某种循环是最好的。
currentImage = None
while currentImage is None:
currentImage = pyautogui.locateOnScreen(passedImage,region=(workSpace), grayscale=True) #search for the image on the screen
(或类似的东西,添加超时、最大重试次数等)
我已经查看了其他问题,例如 (Python 'if x is None' not catching NoneType),但我没有发现这些信息对我的场景有用。
import pyautogui
##########################
#This is a looping routine to search for the current image and return its coordinates
##########################
def finder(passedImage, workSpace): #start the finder func
print (passedImage) #print the image to be found
currentImage = pyautogui.locateOnScreen(passedImage,region=(workSpace), grayscale=True) #search for the image on the screen
if currentImage == None: # if that initial search goes "none" ...
print ("Looking") #Let us know we are looking
finder(passedImage,workSpace) #go and do the function again
print(currentImage) #print out the coordinates
currentImageX, currentImageY = pyautogui.center(currentImage) #get the X and Y coord
pyautogui.click(currentImageX, currentImageY) #use the X and Y coords for where to click
print(currentImageX, currentImageY) #print the X and Y coords
脚本的想法很简单。它只是找到图像的坐标,然后使用 pyautogui 库单击它(模块?对我来说是新术语)
除 "if currentImage == None:" 位外,一切正常。
它有时会在 currentImage 为 None 时捕获,然后适当地重新运行该函数以获取它,但有时它不会。我似乎无法找到它背后的任何韵律或原因,有时有效,有时无效。
任何关于我如何检查 None 然后回应存在 None 的建议都很棒 :)
抛出的示例错误如下:
Traceback (most recent call last):
File "fsr_main_001.py", line 57, in <module>
newItem()
File "fsr_main_001.py", line 14, in newItem
finder.finder(passedImage,workSpace)
File "/home/tvorac/python/formAutomation/finder.py", line 14, in finder
currentImageX, currentImageY = pyautogui.center(currentImage) #get the X and Y coord
File "/usr/local/lib/python3.5/dist-packages/pyscreeze/__init__.py", line 398, in center
return (coords[0] + int(coords[2] / 2), coords[1] + int(coords[3] / 2))
TypeError: 'NoneType' object is not subscriptable
我认为发生的事情是当你说你重新运行这个函数时,你是在递归地这样做。新调用 finder
后没有 return
:
if currentImage == None: # if that initial search goes "none" ...
print ("Looking") #Let us know we are looking
finder(passedImage,workSpace) #go and do the function again
print(currentImage) #print out the coordinates
一旦 finder()
调用完成它的工作,控制 returns 到 currentImage
是 None
的函数实例,它继续打印, pyautogui.center
等等。
考虑到这可能会导致一些相当深的递归,它可能不是查找图像的最佳方法。相反,某种循环是最好的。
currentImage = None
while currentImage is None:
currentImage = pyautogui.locateOnScreen(passedImage,region=(workSpace), grayscale=True) #search for the image on the screen
(或类似的东西,添加超时、最大重试次数等)