質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

8070閲覧

python 画像認識

Wish_N

総合スコア35

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/06/30 11:05

pyautogui を用いて画像認識を行っています。

try:
locate = pyautogui.locateCenterOnScreen('search.png')
pg.click(locate)
except:
pg.alert(text='探索失敗', button='OK')

上記ソースで、pyautogui.locateCenterOnScreen('search.png')が見つからなかった場合に
例外(Except)で補足しています。

上記でも実装できるのですが、IF文のような形で分岐させることはできないでしょうか。

IF pyautogui.locateCenterOnScreen('search.png')
画像発見時の処理
ELSE
画像がなかった時の処理
ENDIF

という風に記述をしたいと考えています。

可能かどうか教えていただきたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

関数で処理をラップすれば可能です。

Python

1def locateCenterOnScreen(path): 2 try: 3 pyautogui.locateCenterOnScreen('search.png') 4 return True 5 except 例外クラス: 6 return False

ただし『記述できる』だけであって、実際に用いるべきかはまた別の話です。

投稿2019/06/30 11:45

LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

pyautogui.locateCenterOnScreen のドキュメントはこちらにあります。

https://pyautogui.readthedocs.io/en/latest/screenshot.html#the-locate-functions

これをみると、見つからない場合は ImageNotFoundException を投げるという仕様になっています。
したがって、例外を用いない方法は不可能です。

コメントを受けての追記: 例外の補足の仕方

ImageNotFoundExceptionpyscreeze で定義されていますので、次のように import してから使ってください。

from pyscreeze import ImageNotFoundException try: locate = pg.locateCenterOnScreen('search3.png') pg.click(locate) except ImageNotFoundException: pg.alert(text='探索失敗', button='OK')

コメントを受けての追記: pyscreeze の設定変更の仕方

pyautogui の内部で使われている pyscreeze2度仕様変更しましたが、pyautogui が2度目の仕様変更に追従していないようです。

このため、pyscreeze が2度目の仕様変更の前の振る舞いをするように、以下のように設定してやる必要があります。

import pyautogui as pg from pyscreeze import ImageNotFoundException # pyscreeze の設定 import pyscreeze pyscreeze.USE_IMAGE_NOT_FOUND_EXCEPTION = True try: locate = pg.locateCenterOnScreen('search3.png') pg.click(locate) except ImageNotFoundException: pg.alert(text='探索失敗', button='OK')

投稿2019/06/30 11:31

編集2019/06/30 12:33
nunukim

総合スコア135

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Wish_N

2019/06/30 11:51

回答いただきありがとうございます。 try: locate = pg.locateCenterOnScreen('search3.png') pg.click(locate) except ImageNotFoundException: pg.alert(text='探索失敗', button='OK') 上記のように例外を補足した場合、 name 'ImageNotFoundException' is not defined と出てしまいます。 例外の捕捉方法が誤っていますでしょうか。
nunukim

2019/06/30 11:59

回答に追記しました
Wish_N

2019/06/30 12:09

nunukimさん 回答ありがとうございます。 下記のように修正したところ、NoneType' object is not subscriptable という例外が発生してしまいました。 import subprocess import pyautogui as pg from pyscreeze import ImageNotFoundException try: locate = pg.locateCenterOnScreen('search3.png') pg.click(locate) except ImageNotFoundException: pg.alert(text='探索失敗', button='OK') Exceptで補足出来ないところで落ちなくはなったのですが、これの原因はわかりますでしょうか。
nunukim

2019/06/30 12:29

pyscreeze に以下のような記述がありました。 # For version 0.1.19 I changed it so that ImageNotFoundException was raised # instead of returning None. In hindsight, this change came too late, so I'm # changing it back to returning None. But I'm also including this option for # folks who would rather have it raise an exception. pyautogui は pyscreeze を使っていますが、pyscreeze が2度仕様変更した(一度変更したものを元に戻した)のに対し、 pyautogui は2回目の仕様変更に追従していないようです。 このため、pyscreeze が2度目の仕様変更の前の振る舞いをするように設定を変えてやる必要があります。 設定のしかたを回答に追記します。
nunukim

2019/06/30 12:34

追記しました。
Wish_N

2019/06/30 13:03

nunukimさん 回答ありがとうございます。 ご丁寧にありがとうございます。 無事実装出来ました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問