0

( Python 'if x is None' not catch 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
4

1 に答える 1

1

関数を再実行していると言うと、再帰的に実行していると思います。returnへの新しい呼び出しの後にはありませんfinder:

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()呼び出しが完了すると、コントロールはcurrentImagewasの関数のインスタンスに戻りNone、出力を続行pyautogui.centerします。

これが非常に深い再帰になる可能性があることを考えると、これはおそらく画像を見つけるための最良の方法ではありません。代わりに、ある種のループが最適です。

currentImage = None
while currentImage is None:
    currentImage = pyautogui.locateOnScreen(passedImage,region=(workSpace), grayscale=True) #search for the image on the screen

(または、タイムアウト、最大再試行などを追加した類似のもの)

于 2016-06-07T15:31:36.720 に答える