LoginSignup
0
2

[Python] PyAutoGUI 画像が表示されている間は待機する処理

Last updated at Posted at 2024-01-23

はじめに

PyAutoGUIで最近2段階認証時にスマホなどに送られてくるコードの入力待機をするために、ある画像が表示されている間は待機する処理が必要となったので、書いておきます。

今回以外のPyAutoGUIでの画像認識によるクリックや待機処理をする方法は以下のページにまとめています。

動作テスト環境

OS: Windows 10 Pro 64bit
言語: Python 3.11.5
ライブラリ:PyAutoGUI 0.9.54

コード

画像が表示されている間は待機する処理
import time
import pyautogui

def wait_while_img_is_displayed(*images, **options):
    """
    PyAutoGUIの画像認識で、指定の画像が表示されている間は待機する関数

    Parameters
    ----------
    *images: str
        画像ファイル名を列挙したもの
    wait_limit: int
        画像が表示されなくなるまで待機する時間。時間内に消えなかったらFalseを返す
    grayscale: bool
        画像認識時のグレースケールONOFF
    confidence: float
        画像認識時の一致率
    """
    
    # 可変長引数を代入
    wait_limit = options.pop('wait_limit', 60) * 5  # 待機時間(int)
    gray_scale = options.pop('grayscale', True)     # 画像認識時のグレースケールONOFF
    confidence = options.pop('confidence', 0.8)     # 画像認識時の判定度合い
    get_img = [True for _ in range(len(images))]
    # 待機時間ループ
    for _ in range(wait_limit):
        # 複数画像設定時のループ
        for i, img in enumerate(images):
            try:
                # 画像認識しなければget_imgをFalseにする
                if pyautogui.locateOnScreen(f'./{img}', grayscale=gray_scale, confidence=confidence) is None:
                    get_img[i] = False
            except pyautogui.ImageNotFoundException:
                get_img[i] = False
        # get_imgがすべてFalseになったらループを抜ける
        if not any(get_img):
            return True
        # 0.2秒待機
        time.sleep(0.2)
    return False
  • 基本的には最初に示したリンク先にある画像待機処理と同じ構成で、複数画像に対応した処理にしました。
  • 判定において、列挙した複数画像のいずれかが画面表示されていれば、get_imgの配列内にTrueが存在することになるため、not any(get_img)で全てがFalseになっているかを判定条件としています

  • ちなみにall関数とany関数による要素の真偽判定は以下の組み合わせとなります。
すべて どれか
True all(list) any(list)
False not any(list) not all(list)

使用例

  • 最初から絶対に画面に指定の画像が表示されている状態で始まるわけではないので、最初に示したリンク先にある画像待機処理と組み合わせます。
  • 1. 画像が表示されるまで待機 -> 2. その画像が表示されている間は待機の2段階で使用する想定となっています。
# 1. 画像が表示されるまで待機(2段階認証画面が表示されるまで)
wait_img("wait00.png", "wait01.png")
# 2. 画像が表示されなくなるまで待機(2段階認証の入力が完了するまで)
wait_while_img_is_displayed("wait00.png", "wait01.png")
0
2
0

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
2