0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Python】Try文でエラー回避を無限ループ

Last updated at Posted at 2022-08-03

<初めに>
pyautoguiの画像検索を使用している際に、
座標取得できるまで、無限ループさせたかったので以下のコードにたどり着いた

<コード>
↓このコードコピペで使用できます

    #座標検索
  #(img=検索画像, target_range=画像検索範囲(left,top,width,height)※タプル型です)
    def search(img, target_range):
        n = 0
        #座標が取得出来るまで無限ループ
        while True:
            try:
                if n == 0:
                    p = pyautogui.locateOnScreen(img, grayscale=True, confidence=.6, region=target_range)
                    x, y = pyautogui.center(p)
                else:
                    print(f'座標取得リトライします:{n}回目')
                    p = pyautogui.locateOnScreen(img, grayscale=True, confidence=.6, region=target_range)
                    x, y = pyautogui.center(p)
            except:
                print('except通った!!')
                time.sleep(2)
                n+=1
            else:
                break
        return x, y

<コード基礎知識>
def = 関数
while True: = 繰り返し文(無限ループ)
try = エラーが出るかもしれない文を書くところ
except = try文内でエラーが発生したらexcept内の文を処理する
else = tryが回ったら処理するところ(exceptが回ったら処理しない)
return = def(関数)の戻り値

<コード詳細>

    #座標検索
    def search(img, target_range):
        n = 0
        #座標が取得出来るまで無限ループ
        while True:

def search(img, target_range)
⇒ 関数名(画像パスが入っている変数, 画像検索範囲が入っている変数)
  img = 画像パス
  target_range = (left, top, width, height)のタプル型数値が入っている

while True:
⇒ 繰り返し処理(無限ループ)

try:
    if n == 0:
    p = pyautogui.locateOnScreen(img, grayscale=True, confidence=.6, region=target_range)
    x, y = pyautogui.center(p)

try:
⇒ エラーが出るときに備えて入れている(エラーがでたら次のexpectで処理)

if n == 0:
⇒ 画像検索一回目の場合は以下の処理をする

p = pyautogui.locateOnScreen(img, grayscale=True, confidence=.6, region=target_range)
⇒ pyautogui.locateOnScreen() = pyautoguiの画像検索モジュール
  img = 画像パス
  graiscale=True = 画像をグレーにするかしないか
  confidence=6 = 画像検索精度
  region=target_range = 画像検索範囲(画面上に類似の表示があるときに使用)

x, y = pyautogui.center(p)
⇒ 画像検索できたら座標がここにはいる

else:
    print(f'座標取得リトライします:{n}回目')
    p = pyautogui.locateOnScreen(img, grayscale=True, confidence=.6, region=target_range)
    x, y = pyautogui.center(p)

else:
⇒ 変数nが0以外のもの全て以下の処理をする
  ※今回は、一回目の画像検索以外はリトライなので条件分岐(if文)を使用

print
⇒ スクリプト処理内容表示

p = pyautogui.lo....
x,y = pyautogui.cen...
⇒ 上記と同じ処理

except:
    print('except通った!!')
    time.sleep(2)
    n+=1

except:
⇒ try文内でエラーが出たらexcept内の処理が回る

print
⇒ 表示

time.sleep
⇒ スクリプト一時停止

n+=1
⇒ 無限ループの回数をカウント(今回の処理では2回目以降はリトライとする為導入)

    else:
        break
return x, y

else:
⇒ try文のelseは、try文が起動した最後の処理(exceptではbreakは起動しない)
  ※breakはtry文のif n == 0:のブロック末に入れても同じ処理が行われる

rerun
⇒ def(関数)の戻り値

<終わりに>
except内に画像検索を入れていたが、それだと最大2回までしか画像検索できないと思い
このスクリプトを作成
処理の詳細も細かく書いたつもりなので、Python初心者の方にも読みやすいサイトを目指します(^^)

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?