【Python】PyAutoGUIで作業の自動化・業務の効率化【RPA】

PyAutoGUIの解説ページアイキャッチ

このページにはプロモーションが含まれています

このページでは、Python の PyAutoGUI について紹介していきます。

PyAutoGUI を使えば、下のアニメのようにマウス操作(マウスカーソルの移動・クリック)や、

locateAllOnScreen関数の説明アニメ

キーボード入力を Python スクリプトから実行することができるようになります。

write関数で日本語入力を行う様子

これらのアニメで行われている操作は、私が自身の手でマウスやキーボードを動かしているのではなく、全て Python を実行することで自動的に行われている操作になります。そして、Python から利用しているのが PyAutoGUI になります。

このように、PyAutoGUI を利用すれば、パソコン上で行うマウス操作やキーボード操作等の作業を自動化することができるようになります。また、実際に利用してみるとパソコンを支配しているみたいに感じることができ、単純に面白さも感じられると思います!

このページでは、最初に PyAutoGUI について説明を行い、その後 PyAutoGUI の使い方や利用可能な PyAutoGUI の解説について解説していきます!

MEMO

このページの解説は、下記を利用した時の動作確認結果に基づいて行なっています

  • PyAutoGUI のバージョン:0.9.53
  • OS : MacOSX

PyAutoGUI

まずは PyAutoGUI について簡単に説明しておきます。

PyAutoGUI とは

PyAutoGUI は Python 向けのライブラリの1つで、Robotic Process Automation (RPA) 実現用のライブラリとなります。簡単に言えば、PC 上で行う作業を、まるでロボットに行わせるかのように、Python スクリプトから実行するためのライブラリです。

PyAutoGUIで人が行う作業をPythonにやらせるイメージ図

こういった作業の自動化を行うためのライブラリは多く存在しますが、おそらく、それらの中でも PyAutoGUI の汎用性は一番高いと思います。使いこなせれば、PC 上での作業の多くを自動化することができます。ですが、汎用性が高いが故に、使いにくい部分もあったり、地道なプログラミングが必要だったりもします…。

スポンサーリンク

PyAutoGUI でできること

PyAutoGUI を利用することで、Python スクリプトから例えば下記のような作業を実行できるようになります。

  • マウス操作
  • キーボード入力
  • スクリーンショット撮影
  • 画像認識

PyAutoGUI の汎用性が高い理由は上記の4つの処理が実行できる点にあります。これらが実行できるため、理論上、PyAutoGUI を利用することでパソコンで行う操作のほとんどが自動化できることになります。

大袈裟に感じるかもしれませんが、あなたがパソコンで作業する上で行なっている手順について考えてみてください。ほとんどの手順は上記の4つの処理と同様の処理によって実現しているはずです。

例えば、パソコンでアプリのボタンをクリックする作業について考えてみましょう。

まず、ボタンを押すためには、あなたはパソコンの画面を見るはずです。

人間がボタンを押す手順1

そして、画面の中からボタンを見つけ出し、その位置を認識するはずです。

人間がボタンを押す手順2

さらに、その位置に対してマウスカーソルを移動させ、そこでクリックを行うはずです。

人間がボタンを押す手順3

もちろん、意味もなくマウスをクリックすることもあるかもしれませんが、何かしらの目的を持ってマウスをクリックする際には、上記のように「画面を見る」「対象の位置を認識する」「マウス操作を行う」の手順でクリックを行なっているはずです。

そして、これらの手順は全て PytAutoGUI から実施することが可能です。

まず、画面を見る手順は PyAutoGUI では画面のスクリーンショットの撮影に置き換えられます。これにより、画面全体の画像が得られることになります。

PyAutoGUIがボタンを押す手順1

また、対象の位置を認識する手順は、PyAutoGUI では画像認識の処理に置き換えられます。この画像認識では、先ほど撮影したスクリーンショットの中からクリックしたい対象の画像と一致する領域を探索し、その位置を取得することができます。今回の場合は、ボタンの画像と一致する部分を探索し、その位置を取得することになります。

PyAutoGUIがボタンを押す手順2

さらに、マウス操作を行う手順は PyAutoGUI でも可能で、先ほど取得した位置にマウスカーソルを移動させ、さらにマウスをクリックすることができます。

PyAutoGUIがボタンを押す手順3

こんな感じで、PyAutoGUI を利用すればボタンのクリック操作などは簡単に実現することができます。また、マウス操作だけでなくキーボード操作も可能なので、クリックの代わりに文字列の入力なども行うこともできます。

ここで重要なのは、パソコン上での我々人間の作業は、基本的には「画面を見る」「対象の位置を認識する」「何かしらの操作を行う」ことで実現されているという点です。そして、これらは全て PyAutoGUI から実行可能なので、パソコン上で人間が行なっている作業の多くは PyAutoGUI を利用することで自動化できると言えます。

ということで、この PyAutoGUI で実現可能な作業の自動化の幅は広く、他のライブラリに比べても汎用性の高いライブラリと言えます。

ここまで聞くと凄く便利そうなライブラリにも思えますが、実際に作業を自動化するための実装は結構泥臭いです。まず、前述のように画像認識を行う際には、画面のスクリーンショットと、探索対象となる画像の2つが必要となります。スクリーンショットは PyAutoGUI の関数を実行すれば簡単に撮影できますが、探索対象となる画像に関しては予め用意しておく必要があります。この画像を用意しておくところが面倒です…。

また、画像認識の精度によっては探索対象の探索に失敗し、意図した位置でのクリック等の操作が実施できない場合もあります。

なので、面倒だったり、使ってみても上手く動作してくれないような場合もあるかもしれませんが、前述の通り PyAutoGUI の自動化に対する汎用性は高いため、使いこなせるようになった際のメリットは大きいと思います。

PyAutoGUI における FAILSAFE 機能

大体 PyAutoGUI で出来ることについてはイメージが湧いたのではないかと思います。

ここからは、PyAutoGUI の具体的な使い方について解説していきますが、最初に、安全に PyAutoGUI を利用するためFAILSAFE 機能について紹介しておきます。

PyAutoGUI を利用する危険性

前述の通り、PyAutoGUI を利用することで Python スクリプトからマウス操作やキーボード操作を行うことが出来るようになります。これはつまり、いつもはユーザーが持っているマウス・キーボードの制御権限を Python スクリプトに委譲することを意味します。

これって結構怖い話なんですよね…。マウス・キーボードの制御権限が Python スクリプトに委譲されている間、ユーザーは基本的にマウス・キーボード操作が行えなくなります。したがって、Python スクリプトの作りによっては、永遠にマウス・キーボード操作をユーザーが行えなくなることになります。

例えば、無限ループを組み、その中でマウスのクリックを行うような処理を実装すれば、Python スクリプトが延々とクリック操作を行い、ユーザーからはまともなマウス操作が行えなくなります。マウス操作が行えないと Python スクリプトを終了させることも困難になり、まさに制御不能な状態になってしまいます。

スポンサーリンク

FAILSAFE 機能

ですが、安心してください。PyAutoGUI には、このような制御不能になった場合の救済措置として FAILSAFE 機能が存在します。

FAILSAFE 機能とは、マウスカーソルが特定の位置に存在する場合に例外を発生させる機能になります。そのため、Python スクリプトが延々にマウス・キーボード操作を行うような場合でも、その特定の位置にマウスカーソルを移動させてやれば、例外を発生させて Python スクリプトを強制的に停止させることができます。

この特定の位置とは、基本的にはパソコンの画面の左上端・左下端・右上端・右下端の位置となります。これらの位置は PyAutoGUI 内部で FAILSAFE_POINTS という変数で管理されています。つまり、PyAutoGUI を利用している Python スクリプトを強制的に停止させたい場合は、マウスカーソルを上記の FAILSAFE_POINTS のいずれかに移動させてやれば良いことになります。

FAILSAFE機能を発動させるためにマウスカーソルを移動させる様子

また、PyAutoGUI を利用した場合、Python スクリプトからマウス・キーボード操作を実行する際に毎回 0.1 秒の sleep が入ることになります。従って、この 0.1 秒の間はユーザーにマウス・キーボードの制御権限が戻ってきます。そのため、この 0.1 秒の間にマウスカーソルを FAILSAFE_POINTS に移動させてやれば、スクリプトを強制的に停止させることができます。

0.1 秒の間に Python スクリプトの終了操作を行うのは困難ですが、マウスを画面の隅に移動させるくらいであれば十分可能です。

PyAutoGUI を利用するのであれば、この FAILSAFE 機能については必ず覚えておいてください。私も PyAutoGUI を利用していてマウスが操作不可になり、Python スクリプトを停止させられなくて結局パソコンの電源を OFF することになった経験があります…。保存していなかったデータなどは消えてしまう可能性もあるため、FAILSAFE 機能については覚えておき、いざというときは FAILSAFE 機能を利用するようにしましょう!

PyAutoGUI の使い方

ちょっと前置きが長くなりましたが、ここからは PyAutoGUI の使い方について解説していきます。

PyAutoGUI をインストールする

PyAutoGUI を利用するためには PyAutoGUI のインストールが必要となります。このインストールは pip コマンドで行えますので、下記のコマンドを実行して PyAutoGUI をインストールしてください。

python -m pip install pyautogui

ちなみに、PyAutoGUI のインストールを行うと画像処理ライブラリの PIL (Pillow) も一緒にインストールされることになります。PyAutoGUI では画像を扱うため、このライブラリが必要となるわけですね。

スポンサーリンク

OpenCV をインストールする

PyAutoGUI のインストールを行えば PyAutoGUI 自体は利用できるのですが、PyAutoGUI の機能によっては OpenCV の機能が利用されるものがあります。具体的には、locateOnScreen という関数で confidence という引数を利用するためには OpenCV のインストールが必要となります。

今後の解説でも confidence 引数を利用することを前提とした例を示していますし、PyAutoGUI をフルに活用したいのであれば OpenCV もインストールしておくことをオススメしますし、

OpenCV に関しても pip コマンドでインストール可能です。

python -m pip install opencv-python

また、上記コマンドでは OpenCV の標準機能のみがインストールされることになりますが、次のコマンドを実行すれば OpenCV の拡張機能も利用することが出来るようになります。PyAutoGUI を利用するだけであれば上記のコマンドだけで十分だと思いますが、今後 OpenCV を利用して様々なことを行いたいという方は、下記コマンドも実行しておいて良いと思います。

python -m pip install opencv-contrib-python

PyAutoGUI を import する

これで PyAutoGUI を利用する準備が整ったことになりますので、次は Python スクリプトを編集して PyAutoGUI を早速利用していきたいと思います。

まず、他のライブラリやモジュール同様に、PyAutoGUI も Python スクリプトから利用する場合は import が必要になります。PyAutoGUI の import は、スクリプトの先頭に下記を記述することで行うことができます。

PyAutoGUIのimport
import pyautogui

PyAutoGUI の関数を呼び出す

あとは、PyAutoGUI が提供する関数を呼び出して、Python スクリプトに作業を実行させるようにしてやれば良いだけです。上記のように PyAutoGUI を import した場合、下記の形式の記述により PyAutoGUI の関数を呼び出すことができます。

PyAutoGUIの関数の呼び出し
pyautogui.関数名(引数...)

PyAutoGUI には多くの関数が用意されており、これらを実行することでパソコン上で人が行う作業を Python スクリプトから実行できるようになります。そして、これらの関数呼び出しを組み合わせて利用することで、複雑な作業も Python スクリプトから自動で行うこともできるようになります。

PyAutoGUI が提供する関数の詳細に関しては後述の PyAutoGUI の関数 で説明しますし、関数呼び出しの例は PyAutoGUI の利用例 で紹介したいと思います。

スポンサーリンク

PyAutoGUI で扱う座標

PyAutoGUI の利用例を示す前に、PyAutoGUI では座標を扱う機会が多いので、ここで PyAutoGUI で扱う座標について説明しておきます。

PyAutoGUI で扱う座標はパソコンの画面上の位置であることが多く、(0, 0) 座標は画面の左上隅となります。そして、x 座標(横方向の座標)の正方向は右になり、画面の右側ほど x が大きくなります。また、y 座標(縦方向の座標)の正方向は下になり、画面の下側ほど y が大きくなります。

PyAutoGUIで扱う座標の意味合いを説明する図

どうも現状の PyAutoGUI では画面の解像度が考慮されないようなので、画面の解像度を変更している場合は座標と画面上の位置が噛み合わないことがあるので注意してください。

PyAutoGUI の利用例

ここでは、PyAutoGUI の利用の仕方や関数の呼び出し方のイメージを掴んでいただくために、簡単な例としてボタンをクリックするスクリプトを示していきたいと思います。

そのボタンをクリックするスクリプトの例が下記となります。まず、下記のスクリプトをコピペして Python スクリプトファイルとして保存してください。実行さえできればファイル名や保存先のフォルダはどこでも良いです。が、ファイル名を付けた方が解説しやすくなるので、ここでは下記スクリプトを button_click.py で保存するものとして説明をしていきます。

button_click.py
import pyautogui

box = pyautogui.locateOnScreen('blue_button.png', confidence=0.9, minSearchTime=10)
x, y = pyautogui.center(box)
pyautogui.moveTo(x, y, duration=1)
pyautogui.click()

今回は、上記の button_click.py によってクリックするボタンは下記のものとしたいと思います。

クリックしてね!

続いては、このボタンのみをスクリーンショット機能等を利用して撮影し、blue_button.png というファイル名で保存してください。Mac であれば、shift + commnd + 4 キーを同時押しすることで領域を選択してスクリーンショットを撮影することが可能です。Windows であれば、windows + shift + s キーを同時押しすることで領域を選択してスクリーンショットが撮影できると思います。

撮影結果となる blue_button.png は下図のようなものになります。これを保存して使用するのでも良いのですが、ブラウザの設定などによって表示サイズが異なる可能性があるため、実際に先ほど示したボタンをスクショして撮影する方が無難だと思います。

クリック対象となるボタンの画像

さらに、保存した blue_button.pngbutton_click.py を実行する際の作業フォルダに移動してください。基本的には button_click.py を保存したフォルダと同じフォルダに移動するので良いと思いますが、VSCode や IDE を利用し、複数のフォルダをまとめて作業フォルダ(ワークスペース)としている場合は、作業フォルダと button_click.py の保存フォルダが異なる可能性があるので注意してください。

また、要は locateOnScreen の第1引数に、クリックしたいボタンの画像のファイルパスを指定すれば良いだけなので、locateOnScreen の第1引数に指定するファイルパスを変更しても良いです。

以上で、スクリプトを実行するための準備が整ったことになります。

続いて、button_click.py を実行する上での注意点を述べておきます。

まず、先ほど用意したスクリプトでボタンをクリックするためには、先ほど保存した画像と一致するボタンがパソコンの画面内に存在する必要があります。そのため、先ほど示したボタンを画面に表示した状態で button_click.py を実行することになります(クリック可能なボタンは後ほど示します)。

また、今回用意するボタンには、この章の先頭、すなわち PyAutoGUI の使い方 へのリンクの設定を行なっています。したがって、ボタンをクリックするとリンク先にジャンプすることになります。もしスクリプトを実行してリンク先にジャンプできれば、button_click.py によるボタンのクリックが上手く動作したことが確認できたことになります(この後もまだまだ解説は続くので、ジャンプした後は是非この場所まで戻ってきてください)。

ということで、実際に button_click.py を実行してみましょう!

下のボタンを表示した状態で button_click.py を実行してみてください。表示した状態でのスクリプトの実行が難しいのであれば、スクリプトを実行後に下のボタンが画面に表示されるようにしてやれば良いです。そして、スクリプトを実行&ボタンの表示を行った状態で待機していれば、マウスが勝手に動き出してボタンがクリックされるはずです。

 

クリックしてね!

 

どうでしょう?上手く動作したでしょうか?

上手く動作した場合、下のアニメのようにマウスが勝手に動き出しボタンがクリックされることを確認できたのではないかと思います。

ボタンをクリックするスクリプトを実行した時の動作を表すアニメ

もしかしたら上手く動作しなかった人もいるかもしれません。ボタンの認識に失敗した場合は、center 関数の中で下記のような例外が発生することになります。

'NoneType' object is not subscriptable

この場合は、locateOnScreen 関数への confidence 引数の指定値を小さくすると(例えば 0.7 など)上手く動作するかもしれないです。後は表示されているボタンと撮影したボタンのサイズが異なると上手く動作しない可能性もあるので、サイズも見直してみてください。

各関数の詳しい解説は後ほど説明するとして、ここでは上記の button_click.py の流れを簡単に説明しておきます。button_click.py では、次の関数の呼び出しを行なってボタンクリックを実現しています。

  • locateOnScreen:パソコンの画面上から指定した画像と一致する領域を探す
  • center:その領域の中心座標を求める
  • moveTo:その中心座標にマウスカーソルを移動する
  • click:移動先でマウスのクリック操作を行う

これら4つの関数は全て PyAutoGUI から提供される関数であり、これらを組み合わせて実行することで、対象物に対するクリック操作を Python スクリプトから実施できるようになります。

今回は、上記の4つの関数を利用しましたが、他にも PyAutoGUI から提供される関数は多く存在します。例えばキーボード操作なども可能です。そういった PyAutoGUI から提供される関数の中から利用する機会の多い関数をピックアップして後述の PyAutoGUI の関数 で解説していますので、そちらも是非目を通しておいてください。

FAILSAFE 機能を利用する

ついでなので、FAILSAFE 機能についても動作確認しておきましょう!この FAILSAFE 機能を活用することも、PyAutoGUI を利用する上で重要な操作になります。

まずは、先程と同様の手順で button_click.py を実行してみてください。ただし、スクリプト実行&ボタンの表示を行なった後にはマウスカーソルを画面の左上隅に移動させてください。ボタンが認識できない場合は、FAILSAFE 機能とは異なる理由で例外が発生することになるため、ボタンを表示した状態でマウスカーソルを左上隅に移動させる必要があります。

FAILSAFE機能を発動させるためにマウスカーソルを移動させる様子

これにより、Python スクリプトで moveTo を呼び出した際に FAILSAFE 機能が発動して例外が発生し、Python スクリプトが強制的に停止するはずです。

再度、下記にボタンを用意しておきましたので、是非お試しください。

 

クリックしてね!

 

上手く FAILSAFE 機能が発動した場合、下記のような例外が発生し、Python スクリプトの処理が停止することになります。

PyAutoGUI fail-safe triggered from mouse moving to a corner of the screen. To disable this fail-safe, set pyautogui.FAILSAFE to False. DISABLING FAIL-SAFE IS NOT RECOMMENDED.

PyAutoGUI における FAILSAFE 機能 でも解説したように、PyAutoGUI の使い方を誤るとマウスが制御不能になる可能性があります。そんな場合には FAILSAFE 機能を利用して Python スクリプトを強制的に停止させることが必要となりますので、一度は FAILSAFE 機能の利用の仕方を経験しておくことをオススメします。

スポンサーリンク

PyAutoGUI の関数

続いて、PyAutoGUI が提供する関数の中で利用機会の多いものを紹介しておきたいと思います。

ただし、ここで紹介する関数は一部のみであり、PyAutoGUI が提供する関数を全て網羅しているわけではないので注意してください。また、引数も紹介しますが、こちらも指定機会の多いもののみの紹介となります。

具体的には、まず対象物の探索(画像認識)関連の関数として下記を、

続いて、マウス操作関連の関数として下記を、

  • moveTo:マウスカーソルを指定した位置に移動する
  • move:マウスカーソルを指定した距離だけ移動する
  • position:マウスカーソルの位置を取得する
  • click:クリック操作を行う
  • mouseDown・mouseUp:マウスボタンを押す・離す
  • dragTo:指定した位置までドラッグ操作を行う
  • drag:指定した距離だけドラッグ操作を行う

最後に、キーボード操作関連の関数として下記を紹介していきます!

  • write:文字列をキーボード入力する
  • press:キーを押す
  • keyDown・keyUp:キーを押し続ける・離す
  • hotkey:複数のキーを同時に押す

locateOnScreen:画面内から対象を探索する

まず1つ目に紹介するのが locateOnScreen 関数です。

この locateOnScreen は、要は画像認識を行う関数で、パソコンの画面内から第1引数で指定した画像と一致する領域を探索し、一致した領域の情報を返却する関数になります。

PyAutoGUI でできること でも説明した、人間がパソコン上で作業する際に行う「画面を見る」と「対象の位置を認識する」は locateOnScreen 関数により代替することができます。なので、PyAutoGUI を利用する場合、結構頻繁に利用する関数になると思います。

仕組みとしては、locateOnScreen 関数内では画面のスクリーンショットが撮影され、そのスクリーンショットの中から引数で指定した画像と一致する領域を探索しているだけになります。

locateOnScreen関数の説明図

そのため、上手く動作させるためにはパソコンの画面内に引数で指定した画像が表示されている必要があります。

locateOnScreen 関数の使い方

続いて locateOnScreen 関数の基本的な使い方を説明しておきます。

PyAutoGUI の利用例locateOnScreen 関数の使用例を示したとおり、locateOnScreen 関数の第1引数には探索対象を撮影した画像のファイルパスを指定する必要があります。

さらに、locateOnScreen 関数は、その画像と一致する領域がパソコンの画面内に見つかった場合、その「領域の情報」を返却し、見つからなかった場合は None を返却します。locateOnScreen 関数を実行する目的は、探索対象と一致する領域の情報を取得して次の手順(次の関数呼び出し)で利用することにありますので、基本的には返却値を受け取る形で関数呼び出しを行うことになります。

そのため、基本的な locateOnScreen 関数の実行例は下記のような形式となります。

locateOnScreenの使い方
import pyautogui

box = pyautogui.locateOnScreen('画像ファイルのパス')

パソコンの画面内に '画像ファイルのパス' で指定した画像と一致する領域が見つかった場合、関数からは、その領域の情報が返却されることになります。

「領域の情報」とは、具体的には (left, top, width, height) の4つの要素からなるデータであり、(left, top) は一致した領域の左上座標、width は一致した領域の幅、height は一致した領域の高さとなります。

領域の情報の説明図

複数箇所に一致する領域が見つかった場合は、1つの領域の情報のみが返却されることになります。一致した領域の全ての情報を取得したい場合は、後述で紹介する locateAllOnScreen を利用します。

locateOnScreen の引数:confidence

続いて、locateOnScreen 関数の引数について紹介していきます。

locateOnScreen 関数の引数の中で一番重要になる引数が confidence になると思います。

MEMO

前述の通り、この confidence を指定する場合は locateOnScreen 関数内部で OpenCV が利用されることになるため、OpenCV をインストールしておく必要があります

基本的に、locateOnScreen 関数は第1引数で指定される画像がスクリーンショット内の特定の領域と完全一致しない限りは None を返却することになります。ですが、confidence を指定することで、完全一致しなくても似ていれば一致しているとみなし、その領域の情報を返却するようになります。

confidence を指定しなかった場合、デフォルト値である  confidence=0.999 が関数内部で指定されることになります。この場合は、基本的に完全一致しないと一致したと判断されません。それに対し、confidence により小さな値を指定してやれば、完全一致しなくても似ていれば一致していると判断されるようになります。ただし、この場合、探索の成功率は上がりますが、値が小さいほど一致すると判断する基準が甘くなるため、誤検出が発生する可能性が高くなります。

これは私の使い方が悪いだけかもしれませんが、confidence を指定しなかった場合、完全一致するような画像を用意したとしても locateOnScreen 関数での探索に失敗することが結構ありました。なので、個人的には confidence は必ず指定するようにし、探索に成功しやすくするようにしてやった方が良いと思っています。

目安としては 0.9 から 0.95 を指定しておくのが良いかと思います。ただ、これは探索する画像等にもよって異なりますので、結局は試行錯誤しながら confidence の指定値を設定するのが良いと思います。

locateOnScreen の引数:minSearchTime

minSearchTime は探索を続ける時間(秒数)を指定する引数となります。

locateOnScreen 関数は基本的に一度スクリーンショットを撮影し、その中に第1引数で指定された画像が見つからなかった場合は即座に None を返却することになります。つまり、locateOnScreen 関数実行時に、探索対象の画像が画面内に表示されていなければ必ず None が返却されることになります。

それに対し、locateOnScreen 関数に minSearchTime 引数を指定した場合、探索に失敗しても指定した秒数の間スクリーンショットの撮影と画像の探索を繰り返し行なってくれるようになります。なので、locateOnScreen 関数実行時に探索対象の画像が画面内に表示されていなくても、minSearchTime 引数で指定した秒数以内に探索対象の画像が画面内に表示されれば探索に成功することになります。

PyAutoGUI の利用例 でも minSearchTime 引数を指定しており、これは、Python スクリプトを実行してからボタンを表示した場合でも探索が成功するようにしたかったからになります。

locateOnScreen の引数:region

region は探索先となるスクリーンショット内の探索領域を指定する引数になります。

locateOnScreen 関数は基本的にスクリーンショット全体から第1引数で指定される画像と一致する領域を探索することになりますが、region 引数を指定することでスクリーンショット内の探索領域を指定することが可能となります。region 引数には、locateOnScreen 関数の返却値と同じ形式、すなわち (left, top, width, height) の形式のデータを指定する必要があります。

また、region の指定により探索領域を狭めることができるので、locateOnScreen 関数の処理速度が向上します。が、locateOnScreen 関数の第1引数で指定する画像の幅よりも width が、高さよりも height が小さい場合は例外が発生することになるので注意してください。

locateOnScreen の引数:grayscale

grayscale=True を指定することで、探索時に第1引数に指定した画像とスクリーンショットの画像の両方がグレースケール(グレーの画像)に変換され、その状態で画像の探索が行われるようになります。

これによって色や彩度を “ある程度” 無視して画像の探索が行われることになります。

ただ、色や彩度が無視されるのは “ある程度” であって、そもそもグレースケールに変換する際に元々の色や彩度が考慮されることになるため、色や彩度を完全に無視して探索が行われるというわけではありません。なので、grayscale=True を指定したとしても、必ずしも形状さえ同じであれば色味が異なっても探索に成功するようになるというわけではないです。

ですが、グレースケールにすることで、ある程度色や彩度は無視されるため、形状が同じであれば色味が異なっても探索に成功する確率は上がると思います。例えば PyAutoGUI の利用例 で青色のボタンの画像を用意して青色のボタンを探索してクリックする例を示しましたが、grayscale=True を指定するようにすれば、下の赤色のボタンの探索にもおそらく成功するようになるのではないかと思います。

 

クリックしてね!

 

grayscale=True を指定しなかった場合は、青色のボタンの画像を指定しても赤色のボタンの探索には成功しないはずです。このように、grayscale=True を指定することで、ある程度の色や彩度を無視した探索を行うことができるようになります。

center:領域の情報から中心座標を求める

center 関数は、locateOnScreen 関数の返却値である領域の情報 (left, top, width, height) から、その領域の中心の x 座標と y 座標を求めて返却する関数になります。

center関数の説明図

center 関数の使い方

center 関数は、下記のように locateOnScreen 関数の返却値をそのまま引数に指定して実行することが多いです。

centerの使い方
import pyautogui

box = pyautogui.locateOnScreen('画像のファイルパス')
x, y = pyautogui.center(box)

別に locateOnScreen 関数の返却値でなくても、(left, top, width, height) の形式のデータであれば引数に指定可能となります。

また、center 関数の引数に None を指定した場合は例外が発生するという点に注意してください。上記のように center 関数を使用する場合、 locateOnScreen の返却値が None である、すなわち探索に失敗すると例外が発生することになります。

実は上記で実行している2つの関数の両方の機能を備え持つ関数が存在し、これを利用すれば1つの関数の呼び出しだけで上記の処理を実現することができるようになります。

スポンサーリンク

locateCenterOnScreenlocateOnScreen + center

その関数が locateCenterOnScreen となります。

locateCenterOnScreen は、パソコンの画面内から第1引数で指定した画像と一致する領域探索し、一致した領域の中心座標を返却する関数になります。

つまり、locateCenterOnScreenlocateOnScreencenter の機能を追加した関数となります。

locateCenterOnScreen 関数の使い方

locateCenterOnScreen は、単に locateOnScreen 関数実行後に center 関数を実行するだけの関数であり、基本的に使い方は locateOnScreen と同様になります。ただし、locateOnScreen 関数とは異なり、返却値は見つかった領域における中心座標の xy になります。

また、引数に関しても locateOnScreen と同じものが指定可能です。

locateCenterOnScreenの使い方
import pyautogui

x, y = pyautogui.locateCenterOnScreen('画像のファイルパス')

locateAllOnScreen:探索した全領域の情報を取得する

locateOnScreen 関数と locateCenterOnScreen 関数では第1引数で指定した対象画像と一致するスクリーンショット上の領域の情報が返却されますが、この時に返却される領域の情報は1つのみでした。

それに対し、 locateAllOnScreen 関数は、一致すると判断した領域の情報の全てを返却する関数になります。

そして、for ループなどを利用することで、見つかった領域全てに対してクリック等の操作を行うことが可能となります。

locateAllOnScreen 関数の使い方

例えば下記は、button.png の画像と一致する画面内の全ての領域の情報を取得し、その全領域の中心座標をクリックするスクリプトの例となります。基本的には PyAutoGUI の利用例 で紹介した1つのボタンをクリックする例を、複数ボタンをクリックするように変更したものになります。

locateAllScreenの使い方
import pyautogui

boxes = pyautogui.locateAllOnScreen('button.png', confidence=0.95)

for box in boxes:
    x, y = pyautogui.center(box)
    pyautogui.moveTo(x, y, duration=1)
    pyautogui.click()

button.png にボタンの画像を指定すれば、画面内のボタン全てに対してクリック操作が行われることになります。

locateAllOnScreen関数の説明アニメ

便利そうではありますが、locateCenterOnScreen 関数はちょっと使いにくいというのが私の印象です。

その理由の1つ目は minSearchTime 引数が指定できないことです。まぁただ、これに関しては、探索に成功するまで locateAllOnScreen を繰り返し実行して自力で「待ち」を実現すれば良いだけではあります。

2つの目の理由が confidence の調整が難しい点です。confidence の値を下げて探索成功率を上げた場合、誤検出が多くなり、余計な領域の情報まで取得してしまうことになります。例えば、上のアニメの例でいえば、4つのボタンの領域だけでなく、もっと多くの領域の情報が取得できてしまい、4回以上のクリックが行われることになります。

かといって、confidence の値を上げると探索に失敗することになりますし、この confidence の調整が難しいという印象です。

screenshoft:スクリーンショットを撮影する

screenshot は画面のスクリーンショットを撮影する関数になります。返却値として、その撮影した画像の PIL 画像オブジェクトを取得することができます。

locateOnScreenlocateCenterOnScreen でも関数内部でスクリーンショットの撮影が行われることになりますが、内部で screenshot 関数が利用されて撮影が行われています。

screenshot 関数の使い方

引数なしで screenshot 関数を実行すれば画面全体のスクリーンショットを撮影することができます。

返却値は PIL 画像オブジェクトであり、ここでは詳細な解説は行いませんが、例えば画像のファイル保存・リサイズ・回転など、さまざまな画像に対する処理を行うことができます。

例えば下記は、画面全体のスクリーンショットを screen.png というファイル名で保存する例になります。

screenshotの使い方
import pyautogui

image = pyautogui.screenshot()
image.save('screen.png')

screenshot 関数の引数:region

また、region 引数を指定することで、撮影したスクリーンショットのトリミング後画像を取得することもできます。region には、locateOnScreen 関数の返却値と同等の形式のデータ、すなわち領域の情報 (left, top, width, height) の形式でトリミング範囲を指定します。

スポンサーリンク

moveTo:マウスカーソルを指定した位置に移動する

ここからはマウス操作に関する関数を紹介していきます。

moveTo 関数はマウスカーソルの位置を移動する関数の1つになります。

moveTo 関数の場合、実行すると、第1引数と第2引数(もしくは x 引数と y 引数)で指定された座標にマウスカーソルを移動させることができます。

moveTo関数の説明図

moveTo 関数の使い方

基本的には、moveTo 関数は第1引数と第2引数(もしくは x 引数と y 引数)でマウスカーソルの移動先を指定して実行します。座標の原点は画面の左上隅となり、第1引数で指定する横方向の座標の正方向は右、第2引数で指定する縦方向の座標の正方向は下となります。

例えば下記を実行すれば、パソコンの画面上の (100, 200) 座標にマウスカーソルが移動することになります。返却値は常に None となるため、返却値を受け取る必要はありません。

moveToの使い方
import pyautogui

pyautogui.moveTo(100, 200)

moveTo 関数の引数:duration

duration 引数を指定することで、マウスカーソルが引数で指定した座標に移動するまでの時間を指定することができます。duration 引数を指定しなかった場合、moveTo 関数を指定した直後にマウスカーソルが即座に指定した座標に移動することになります。

それに対し、duration 引数を指定することで、マウスカーソルをゆっくり移動させることができます。例えば、duration=1 を指定すれば、1 秒かけてマウスカーソルが指定された座標に移動することになります。

PyAutoGUI の利用例 でも duration=1 を指定しています。別に duration 引数を指定しなくてもボタンのクリックを実現することは可能ではあったのですが、マウスカーソルが移動する様子が確認できた方が、プログラムにマウスの制御が乗っ取られている感があって見栄えが良いかなぁと思って duration=1 を指定しています。これだけの目的です…。

move:マウスカーソルを指定した距離だけ移動する

move 関数も moveTo 関数同様にマウスカーソルの位置を移動する関数の1つになります。

ただし、moveTo 関数が第1引数と第2引数(もしくは x 引数と y 引数)で指定された座標にマウスカーソルを移動させるのに対し、move 関数は現在のマウスカーソルの位置から第1引数と第2引数(もしくは xOffset 引数と yOffset 引数)指定された距離の分だけマウスカーソルを移動させる関数となります。

move関数の説明図

move 関数の使い方

基本的には、move 関数は第1引数と第2引数(もしくは xOffset 引数と yOffset 引数)でマウスカーソルを移動したい距離を指定して実行します。

距離の単位はピクセルで、第1引数で指定したピクセル数だけマウスカーソルが右方向に移動し、第2引数で指定したピクセル数だけマウスカーソルが下方向に移動することになります。負の値を指定すれば逆方向にマウスカーソルが移動します。

例えば下記を実行すれば、マウスカーソルが現在位置から左方向に 100 ピクセル、上方向に 200 移動することになります。

moveの使い方
import pyautogui

pyautogui.move(-100, -200)

move 関数の引数:duration

moveTo 関数同様に引数 duration が指定可能です。意味合いも同じなので、詳しくは moveTo 関数の引数:duration を参照してください。

moveRel 関数

実は、moveRel という関数も PyAutoGUI に存在しますが、この関数は move 関数と全く同じものになります。

position:マウスカーソルの位置を取得する

また、PyAutoGUI には position 関数が存在し、この関数で現在のマウスカーソルの位置を取得することができます。

position関数の説明図

position 関数の使い方

position 関数は引数なしで実行すると、返却値として現在のマウスカーソルの位置 (x, y) を取得することができます。したがって、例えば下記のように処理を実行した場合は moveTo(0, 0) と同様の動作になります。

positionの使い方
import pyautogui

x, y = pyautogui.position()
pyautogui.move(-x, -y)

スポンサーリンク

click:クリック操作を行う

click は名前の通り、マウスでのクリック操作を行う関数になります。クリックとは、要はマウスのボタンを押して離す操作となります。

click関数の説明図

click 関数の使い方

click 関数の一番簡単な使い方は下記になります。下記のように引数を指定せずに実行した場合、現在のマウスカーソルの位置に対してマウスの主ボタンでのクリックが一度だけ実行されます。主ボタンは、パソコンの利き腕設定等によって代わっている可能性がありますが、基本的にはマウスの左ボタンになります。

clickの使い方
import pyautogui

pyautogui.click()

click 関数の引数:xy

click 関数に第1引数と第2引数(もしくは x 引数と y 引数)を指定することで、現在のマウスカーソルの位置ではなく、マウスカーソルを (x, y) 座標に移動させてからクリックを行うことができます。 

PyAutoGUI の利用例 の例では moveTo 関数を利用してマウスを移動させましたが、実は moveTo 等のマウスを移動させる関数を利用しなくても click 関数のみでマウスの移動からクリックまで行うことができます。

click 関数の引数:duration

さらに、マウスカーソルを移動させてからクリックを行う場合、つまり、click 関数に第1引数と第2引数(もしくは x 引数と y 引数)を指定した場合、moveTo 関数同様に引数 duration が有効となります。意味合いも moveTo 関数の場合と同じなので、詳しくは moveTo 関数の引数:duration を参照してください。

click 関数の引数:clicks

さらに、clicks 引数によってクリックする回数を指定することもできます。デフォルトは clicks=1 となっていますが、clicks 引数を指定すれば、1回の click 関数の実行によって複数回のクリックを実現することも可能です。

click 関数の引数:interval

そして、複数回クリックを行う場合、各クリックの実行間隔を interval 引数によって指定することも可能です。例えば interval=0.5 を指定すれば、0.5 秒間隔でクリックが実行されることになります。

click 関数の引数:button

また、button 引数によってクリックするボタンを指定することも可能です。

button 引数に指定可能な値は下記のようになっており、デフォルトは PRIMARY となります。

  • pyautogui.LEFT:左ボタンでのクリック
  • pyautogui.RIGHT:右ボタンでのクリック
  • pyautogui.MIDDLE:右ボタンでのクリック
  • pyautogui.PRIMARY:主ボタンでのクリック
  • pyautogui.SECONDARY:副ボタンでのクリック

主ボタン・副ボタンはパソコンの設定によって変化する可能性はありますが、基本的にはそれぞれ左ボタンと右ボタンになると思います。

click 関連のショートカット関数

また、click 関数には様々なショートカット関数が用意されており、これを利用することで引数の指定を省略して行いたい操作を実現できるようになっています。

  • leftClick 関数:click(button=pyautogui.LEFT, clicks=1) と同じ
  • rightClick 関数:click(button=pyautogui.RIGHT, clicks=1) と同じ
  • middleClick 関数:click(button=pyautogui.MIDDLE, clicks=1) と同じ
  • doubleClick 関数:click(clicks=2) と同じ
  • tripleClick 関数:click(clicks=3) と同じ

例えば、leftClick 関数では button=pyautogui.LEFTclicks=1 を指定して click 関数が実行されることになります。その他の引数に関しては click 関数と同様のものを指定可能です。その他の関数にも同様のことが言えます。

mouseDownmouseUp:マウスボタンを押す・離す

先程 click 関数の解説を行いましたが、クリックとはマウスのボタンを押して離す操作となります。

click 関数の場合、マウスのボタンを押す操作と離す操作が連続して行われることになりますが、これらは別々の関数で実行することも可能です。

マウスのボタンを押す操作を行うのが mouseDown 関数で、マウスのボタンを離す操作を行うのが mouseUp 関数になります。

mouseDown 関数と mouseUp 関数の使い方

使い方は click 関数に似ていて、要は第1引数と第2引数(もしくは x 引数と y 引数)でマウス操作を行う座標を指定して実行すれば、その座標でマウスのボタンを押す操作 or マウスのボタンを離す操作が行われることになります。また、第1引数と第2引数を指定しなかった場合、現在のマウスカーソルの位置で同様の操作が行われることになります。

例えば、下記のように処理を行えば、座標 (100, 200) でマウスのクリックが2回行われることになります。

mouseDownとmouseUpの使い方
import pyautogui

pyautogui.mouseDown(100, 200)
pyautogui.mouseUp()
pyautogui.mouseDown()
pyautogui.mouseUp()

mouseDown 関数と mouseUp 関数の引数

第1引数と第2引数(もしくは x 引数と y 引数)以外にも duration が指定可能ではあるのですが、なぜか関数内部で duration の値が 0 に置き換えられるようになっていました。

なので、少なくとも私が利用しているバージョンの PyAutoGUI では、引数としては duration が指定可能ですが、無視されるようになっていることになります。

dragTo:指定した位置までドラッグ操作を行う

マウス操作の最後としてドラッグ関連の関数を紹介しておきます。最初に紹介するのが dragTo 関数になります。

dragTo関数の説明図

dragTo は現在のマウスカーソルの位置から第1引数と第2引数(もしくは x 引数と y 引数)で指定された座標までドラッグ操作を行う関数となります。

dragTo 関数の使い方

感覚的には click 関数同様の使い方になると思いますが、dragTo 関数は “現在のマウスカーソルの位置” からドラッグ操作を行う関数なので、dragTo 関数を実行する前に、まずはドラッグしたい対象にマウスカーソルを合わせておく必要があります。なので、事前に moveTo 関数等でマウスカーソルの位置を移動させておく必要があります。

例えば下記は、target.png に写っているアイコンのファイルを dst.png に写っているフォルダにドラッグ操作で移動する手順を行う処理の例となります。

dragToの使い方
import pyautogui

t_x, t_y = pyautogui.locateCenterOnScreen('target.png', confidence=0.8, minSearchTime=10)
d_x, d_y = pyautogui.locateCenterOnScreen('dst.png', confidence=0.8, minSearchTime=10)
pyautogui.moveTo(t_x, t_y, duration=1)
pyautogui.dragTo(d_x, d_y, duration=1, button=pyautogui.LEFT)

画像ファイルを用意して実行すれば、下のアニメのように target.png に写っているアイコンのファイルが dst.png に写っているフォルダに対してドラッグ操作が行われることになります。

dragTo関数の使用例を示す図

ポイントは、前述の通り、ドラッグ操作したい対象の位置に moveTo 関数を実行している点と、あとは、ドラッグ操作したい対象の位置とドラッグ先の位置を事前に求めておく必要がある点になると思います。上記では、2つの画像の位置を locateCenterOnScreen 関数を2回実行して求めています。

dragTo 関数の引数:durationbutton

dragTo 関数においては durationbutton の引数が指定可能です。duration に関しては moveTo 関数の引数:duration  で、button に関しては click 関数の引数:button で既に解説していますので詳しくはリンク先を参照していただければと思います。

MEMO

これは Mac 限定の話になるかもしれませんが、なぜか dragTo 関数では button 引数を指定しないと例外が発生するようになっていました

より正確にいうと、button 引数を指定しないとデフォルトで pyautogui.PRIMARYbutton 引数に指定されるようになっているようですが、実際には内部で下記の3つ以外が button 引数に指定されていると例外が発生するようになっており、pyautogui.PRIMARY の場合も例外が発生するようになっているようです

  • pyautogui.LEFT:左ボタン
  • pyautogui.RIGHT:右ボタン
  • pyautogui.MIDDLE:右ボタン

同様の現象が発生するようであれば、button 引数に上記の3つのいずれかを指定するようにしてやればうまく動作するようになる可能性があると思います

スポンサーリンク

drag:指定した距離だけドラッグ操作を行う

ドラッグを行う関数には drag 関数も存在します。dragTo 関数との違いは、move 関数と moveTo 関数との違い同様で、第1引数と第2引数の意味合いにあります。

dragTo 関数を実行した際には、第1引数と第2引数で指定した座標に対してドラッグ操作が行われることになります。それに対し、drag 関数を実行した際には、現在のマウスカーソルの位置から第1引数と第2引数で指定した距離だけドラッグ操作が行われることになります。

drag 関数の使い方

下記は、target.png に写っている対象を、左方向に 300 ピクセル、上方向に 20 ピクセルだけドラッグで移動を行う処理の例となります。

dragの使い方
import pyautogui

t_x, t_y = pyautogui.locateCenterOnScreen('target.png', confidence=0.8, minSearchTime=10)
pyautogui.moveTo(t_x, t_y, duration=1)
pyautogui.drag(-300, -20, duration=1, button=pyautogui.LEFT)/code>

drag 関数の引数

第1引数と第2引数の意味合いに違いはあるものの、他の引数は dragTo 関数と同様になります。

write:文字列をキーボード入力する

ここからは、キーボード操作関連の関数を紹介していきます。

まず最初に紹介するのが write 関数になります。この関数は第1引数(もしくは message 引数)で指定した文字列をキーボード入力する関数になります。

write関数の説明図

write 関数の使い方

基本的には、write 関数は第1引数にキーボード入力したい文字列を指定して実行すれば良いだけの関数になります。

ただし、何らかのアプリ等に対してキーボード入力を行いたいのであれば、事前にそのアプリにフォーカスを合わせておく必要があるので注意してください。例えば、テキストエディタに対してキーボード入力したいのであれば、まずテキストエディタをクリックしてフォーカスを合わせ、その状態で write 関数を実行する必要があります。

例えば、下記は editor.png に写っているテキストエディタの位置を特定し、そのテキストエディタをクリックしてフォーカスを合わせ、さらにその後に、Hello World! を順々にキーボード入力する例となります。interval 引数を指定することで、各文字の入力を行う際に間隔を 0.2 秒空けるようにしています。

writeの使い方
import pyautogui

x, y = pyautogui.locateCenterOnScreen('editor.png', confidence=0.8, minSearchTime=10)
pyautogui.click(x, y, duration=1)
pyautogui.write('Hello World!', interval=0.2)

実行すると、下のアニメのようにテキストエディタに対してキーボード入力が行われることになります。

write関数の動作を説明するアニメ

write 関数は US キーボードのみに対応

write 関数は使用されるキーボードが US キーボードであることを前提に動作するようです。これは、後述で紹介する keyDown 関数や press 関数に関しても同様のことが言える注意点となります。

したがって、JIS キーボードを利用している場合に write 関数を実行すると、意図しないキーボード入力が行われる可能性があります。数字やアルファベットに関しては特に問題ないと思いますが、記号の入力を行うと、write 関数に指定した記号とは異なる記号がキーボード入力される可能性があります。

例えば、Mac Book の US キーボードの場合、@ キーは JIS キーボードの " キー(shift + 2)の位置に存在するため、write 関数で @ 入力を行うと実際には " キーの入力が行われることになります。

これを解決するためには、US キーボードのキー配置を考慮して write 関数の第1引数への文字列指定を行う必要があります。例えば、Mac Book の US キーボードにおける [ キーの位置は、JIS キーボードの @ キーの位置と一致するため、@ キー入力を行いたい場合は @[ に置き換えてから write 関数を実行する必要があります。

より具体的には、daeu@example.com のキーボード入力を行いたいのであれば、下記のように @[ に置き換えた文字列を引数に指定して write 関数を実行してやれば良いです。

writeでの@の入力
import pyautogui

pyautogui.write('daeu[example.com', interval=0.2)

で、これは Mac Book の JIS キーボード利用時の話なので、使用するキーボードによって置き換え方を変更する必要があるかもしれないです。

また、Mac Book の JIS キーボード利用時の場合は置き換え自体が不可な文字もあります。具体的には「¥」「|」「_」「]」の4つになります。

MEMO

¥ に関していえば、write ではおそらく JIS キーボードでは入力が不可となりますが、次に説明する press 関数や keyDown 関数では入力可能となります(引数に 'yen' を指定する)

一応、これらを除く記号を正しくキーボード入力するための変換関数 jis_to_us を下記に用意しておいたので、よかったら利用してください。Mac Book の JIS キーボード利用者向けの関数になりますが、同様の考え方で他のキーボード用に変更して使用することもできると思います。ちなみに、前述で紹介した4つの記号に関しては変換のしようがないので、代わりにスペースをキーボード入力するようにしています。

記号入力用変換関数
import pyautogui

key_maps = {
    '^':'=',
    '@':'[',
    '[':']',
    ':':"'",
    ']':' ',
    '_':' ',
    '"':'@',
    '&':'^',
    '(':'*',
    ')':'(',
    '=':'_',
    '|':' ',
    '+':':',
    '*':'"',
    '}':'|',
    '{':'}',
    '¥':' ',
    "'":'&',
}

def jis_to_us(message):

    result = str()
    for i in range(len(message)):
        if message[i] in key_maps:
            result += key_maps[message[i]]
        else:
            result += message[i]
    return result

pyautogui.write(jis_to_us('daeu@example.com'))

自身の環境で簡単に動作確認しただけなので、上手く動作しない可能性もありますのでご注意ください…。ただ、考え方に関しては理解していただけるのではないかと思います。

また、write 関数は第1引数に日本語の指定は不可となっています。この点もご注意ください。ただし、write 関数で NG なのは第1引数に日本語を指定することであり、日本語入力を ON にした状態で write 関数を実行すれば、ローマ字入力時と同じように日本語の入力を行うことは可能です。

write関数で日本語入力を行う様子

press:キーを押す

write は引数で指定された文字列を順々に連続してキーボード入力する関数でしたが、ここから紹介する関数は1回分のキーボード操作を行う関数になります。

まず紹介するのが press 関数で、これは1つのキーを押す操作を行う関数になります。

press 関数の使い方

press 関数には、押したいキーのキー名を第1引数に指定して実行します。

例えば下記は、a キーと  b キーと left キーと c キーを入力する例となります。結果的に、acb という文字列が入力されることになります。

pressの使い方
import pyautogui

pyautogui.press('a')
pyautogui.press('b')
pyautogui.press('left')
pyautogui.press('c')

press 関数に指定可能なキー名

press 関数に指定可能なキー名は print(pyautogui.KEYBOARD_KEYS) を実行することによって確認可能です。ただし、指定可能であっても正しく動作するかは別の話で、指定しても何も起こらないキー名も存在すると思います。

例えば、私は MacOSX を使用していますが、'volumemute' に関しては実行しても何も起きませんでした…。音量がミュートされることを期待したのですが…。おそらく、上手く動作するかどうかが環境依存であるのものが多く含まれていると思われるため、実際に指定可能なキー名を指定して動作確認してみるのが良いと思います。

press 関数の引数:presses

presses 引数を指定することにより、キーを押す回数を指定することができます。presses=10 を指定すれば、10 回キーが押されることになります。

press 関数の引数:interval

また、キーを複数回押す場合、押す間隔を interval 引数で指定可能です。

スポンサーリンク

keyDownkeyUp:キーを押し続ける・離す

press が単にキーを押す関数であるのに対し、keyDown はキーを押し続ける関数であり、keyUp は押し続けているキーを離す関数になります。

例えば、shift を押しながら他のキーを押すような操作も、keyDown を利用することで実現可能となります。また、keyDown を実行すると、指定したキーが押し続けられることになるため、適切なタイミングで keyUp を実行することが重要となります。

keyDown 関数と keyUp 関数の使い方

keyDownkeyUp 共に、第1引数にキー名を指定して実行します。それにより、keyDown の場合はキー名に対応するキーが押し続けられ、keyUp の場合はキー名に対応するキーが離されることになります。

指定可能なキー名は print(pyautogui.KEYBOARD_KEYS) により確認可能です。

例えば下記は、shift を押した状態で a キーを押し、さらに shift キーを離してから再度 a を押す例となります。結果的には Aaが入力されることになります。

keyDownとkeyUpの使い方
import pyautogui

pyautogui.keyDown('shift')
pyautogui.press('a')
pyautogui.keyUp('shift')
pyautogui.press('a')

hotkey:複数のキーを同時に押す

keyDown を利用すれば複数のキーの同時押しを実現することは可能ですが、複数回 keyDown 関数を実行する必要がありますし、keyUp 関数でキーを離す処理も必要になってちょっと面倒です。

そのため、PyAutoGUI には hotkey 関数が用意されており、この関数で複数のキーの同時押しを簡単に実現することができるようになっています。

hotkey 関数の使い方

hotKey 関数では、複数のキー名を引数で指定することができます。そして、複数のキー名を引数で指定して hotkey 関数を実行した場合、引数の前方で指定するキー名のものから順にキーの押し下げが行われます。そして、全てのキーが押されたのちに、今度は引数の後方で指定するキー名のものから順にキーが離されていくことになります。

例えば下記は、commandshift と 3 のキーを同時押しする例となります(MacOSX でのスクリーンショットを行うキー入力となります)。

hotkeyの使い方
import pyautogui

pyautogui.hotkey('command', 'shift', '3')

ただ、私の環境では hotkey 関数は意図した通りに動いてくれないことが多かったです。確実に意図した通りに動かすためには、hotkey 関数を実行する前に下記のように keyUp'command''shift' のキーを離してから hotkey 関数を実行する必要がありました。

hotkeyが上手く動かない場合
import pyautogui

pyautogui.keyUp('command')
pyautogui.keyUp('shift')
pyautogui.hotkey('command', 'shift', '3')

理由はちょっと謎なのですが、同様の現象が発生する方もおられるかもしれませんので、一応メモとして残しておきます。hotkey 関数が上手く動かないのであれば、面倒ですが keyDownkeyUp を利用してキーの同時押しを実現するのが良いかと思います。 

PyAutoGUI が向いている自動化

最後に、今回紹介した PyAutoGUI が向いている自動化作業について説明しておきます。

前述の通り、パソコン上で行う作業の多くは PyAutoGUI によって自動化することが可能です。クリックしたいボタンやアイコン等の画面上の位置を locateOnScreen 関数等で取得し、その位置を click 関数等でクリックすることもできますし、write 関数等でキーボード入力などを行うことも可能です。

やろうと思えば、ウェブブラウザ上での操作や Excel 上での操作も PyAutoGUI で自動化することができます。とにかく汎用性が高いのが PyAutoGUI の魅力となるでしょう。

ただし、自動化はできるものの、PyAutoGUI を利用するのがベストであるかは自動化したい作業に依ります。例えば、ウェブブラウザ上の操作を自動化するのであれば、汎用的な PyAutoGUI を利用するよりも、ウェブブラウザの自動化に特化した Selenium を利用する方が楽に自動化できると思います。

また、Excel に関しても Excel 操作の自動化に特化した openpyxl を利用する方が楽だと思います。

要は、自動化したい作業に特化したライブラリがあるのであれば、そっちを利用する方が楽に自動化できるという話です。逆に、そういったライブラリが利用できない作業全般に PyAutoGUI は向いています

おすすめ書籍(PR)

そういう意味で、自動化したい作業に合わせて使用するライブラリを適切に選択することが重要です。そして、こういった自動化を行う際に利用可能なライブラリの種類を知る上では、下記の 退屈なことはPythonにやらせよう 第2版 の参考書がオススメです。

この参考書では、今回紹介した PyAutoGUI だけでなく、前述で少し触れた Seleniumopenpyxl などについても解説が行われています。ちなみに、このページでは解説しきれなかった PyAutoGUI の関数等も、退屈なことはPythonにやらせよう 第2版 では解説されています。

また、それだけでなく、PDFWord電子メール画像等に関する自動化についても解説が行われており、自動化に利用できるライブラリを幅広く知るという意味で非常にオススメな参考書になります。1つ1つのライブラリに対する解説は薄めですが、ライブラリの存在を知っていれば、詳細な情報に関しては後でいくらでもネット上から拾うことができます。

序盤では Python の使い方やプログラミングについても解説されていますので、Python に慣れているから Python で作業効自動化・業務効率化を行いたいという人だけでなく、これらに興味がある Python 初心者の方にもオススメの参考書となります。

是非、日常の退屈な作業を自動化し、それによって自分の大切な時間を増やしていきましょう!

スポンサーリンク

まとめ

このページでは、Python のライブラリである PyAutoGUI について解説を行いました!

PyAutoGUI を利用することで、パソコン上で行う多くの作業を Python スクリプトから実行することができるようになり、これらの作業を自動化することができるようになります。

特に、パソコンの画面内から画像認識を行なって対象物の位置を取得したり、マウス操作・キーボード操作を行なったりできるため、PyAutoGUI は作業の自動化の観点においては非常に汎用性の高いライブラリになると思います。

もちろん自動化にも便利ですし、実際使ってみると自分が作ったプログラムがパソコンを支配しているように感じて面白さを感じることができると思います!

是非このページで学んだことを利用して、自身の作業の自動化や業務の効率化に活かしてみてください!

同じカテゴリのページ一覧を表示