このページでは、Python の PyAutoGUI について紹介していきます。
PyAutoGUI を使えば、下のアニメのようにマウス操作(マウスカーソルの移動・クリック)や、
キーボード入力を Python スクリプトから実行することができるようになります。
これらのアニメで行われている操作は、私が自身の手でマウスやキーボードを動かしているのではなく、全て Python を実行することで自動的に行われている操作になります。そして、Python から利用しているのが PyAutoGUI になります。
このように、PyAutoGUI を利用すれば、パソコン上で行うマウス操作やキーボード操作等の作業を自動化することができるようになります。また、実際に利用してみるとパソコンを支配しているみたいに感じることができ、単純に面白さも感じられると思います!
このページでは、最初に PyAutoGUI について説明を行い、その後 PyAutoGUI の使い方や利用可能な PyAutoGUI の解説について解説していきます!
このページの解説は、下記を利用した時の動作確認結果に基づいて行なっています
- PyAutoGUI のバージョン:0.9.53
- OS : MacOSX
Contents
- PyAutoGUI
- PyAutoGUI における FAILSAFE 機能
- PyAutoGUI の使い方
- PyAutoGUI の関数
- locateOnScreen:画面内から対象を探索する
- center:領域の情報から中心座標を求める
- locateCenterOnScreen:locateOnScreen + center
- locateAllOnScreen:探索した全領域の情報を取得する
- screenshoft:スクリーンショットを撮影する
- moveTo:マウスカーソルを指定した位置に移動する
- move:マウスカーソルを指定した距離だけ移動する
- position:マウスカーソルの位置を取得する
- click:クリック操作を行う
- mouseDown・mouseUp:マウスボタンを押す・離す
- dragTo:指定した位置までドラッグ操作を行う
- drag:指定した距離だけドラッグ操作を行う
- write:文字列をキーボード入力する
- press:キーを押す
- keyDown・keyUp:キーを押し続ける・離す
- hotkey:複数のキーを同時に押す
- PyAutoGUI が向いている自動化
- まとめ
PyAutoGUI
まずは PyAutoGUI について簡単に説明しておきます。
PyAutoGUI とは
PyAutoGUI は Python 向けのライブラリの1つで、Robotic Process Automation (RPA) 実現用のライブラリとなります。簡単に言えば、PC 上で行う作業を、まるでロボットに行わせるかのように、Python スクリプトから実行するためのライブラリです。
こういった作業の自動化を行うためのライブラリは多く存在しますが、おそらく、それらの中でも PyAutoGUI の汎用性は一番高いと思います。使いこなせれば、PC 上での作業の多くを自動化することができます。ですが、汎用性が高いが故に、使いにくい部分もあったり、地道なプログラミングが必要だったりもします…。
スポンサーリンク
PyAutoGUI でできること
PyAutoGUI を利用することで、Python スクリプトから例えば下記のような作業を実行できるようになります。
- マウス操作
- キーボード入力
- スクリーンショット撮影
- 画像認識
PyAutoGUI の汎用性が高い理由は上記の4つの処理が実行できる点にあります。これらが実行できるため、理論上、PyAutoGUI を利用することでパソコンで行う操作のほとんどが自動化できることになります。
大袈裟に感じるかもしれませんが、あなたがパソコンで作業する上で行なっている手順について考えてみてください。ほとんどの手順は上記の4つの処理と同様の処理によって実現しているはずです。
例えば、パソコンでアプリのボタンをクリックする作業について考えてみましょう。
まず、ボタンを押すためには、あなたはパソコンの画面を見るはずです。
そして、画面の中からボタンを見つけ出し、その位置を認識するはずです。
さらに、その位置に対してマウスカーソルを移動させ、そこでクリックを行うはずです。
もちろん、意味もなくマウスをクリックすることもあるかもしれませんが、何かしらの目的を持ってマウスをクリックする際には、上記のように「画面を見る」「対象の位置を認識する」「マウス操作を行う」の手順でクリックを行なっているはずです。
そして、これらの手順は全て PytAutoGUI から実施することが可能です。
まず、画面を見る手順は PyAutoGUI では画面のスクリーンショットの撮影に置き換えられます。これにより、画面全体の画像が得られることになります。
また、対象の位置を認識する手順は、PyAutoGUI では画像認識の処理に置き換えられます。この画像認識では、先ほど撮影したスクリーンショットの中からクリックしたい対象の画像と一致する領域を探索し、その位置を取得することができます。今回の場合は、ボタンの画像と一致する部分を探索し、その位置を取得することになります。
さらに、マウス操作を行う手順は PyAutoGUI でも可能で、先ほど取得した位置にマウスカーソルを移動させ、さらにマウスをクリックすることができます。
こんな感じで、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
のいずれかに移動させてやれば良いことになります。
また、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
は、スクリプトの先頭に下記を記述することで行うことができます。
import pyautogui
PyAutoGUI の関数を呼び出す
あとは、PyAutoGUI が提供する関数を呼び出して、Python スクリプトに作業を実行させるようにしてやれば良いだけです。上記のように PyAutoGUI を import
した場合、下記の形式の記述により PyAutoGUI の関数を呼び出すことができます。
pyautogui.関数名(引数...)
PyAutoGUI には多くの関数が用意されており、これらを実行することでパソコン上で人が行う作業を Python スクリプトから実行できるようになります。そして、これらの関数呼び出しを組み合わせて利用することで、複雑な作業も Python スクリプトから自動で行うこともできるようになります。
PyAutoGUI が提供する関数の詳細に関しては後述の PyAutoGUI の関数 で説明しますし、関数呼び出しの例は PyAutoGUI の利用例 で紹介したいと思います。
スポンサーリンク
PyAutoGUI で扱う座標
PyAutoGUI の利用例を示す前に、PyAutoGUI では座標を扱う機会が多いので、ここで PyAutoGUI で扱う座標について説明しておきます。
PyAutoGUI で扱う座標はパソコンの画面上の位置であることが多く、(0
, 0
) 座標は画面の左上隅となります。そして、x
座標(横方向の座標)の正方向は右になり、画面の右側ほど x
が大きくなります。また、y
座標(縦方向の座標)の正方向は下になり、画面の下側ほど y
が大きくなります。
どうも現状の PyAutoGUI では画面の解像度が考慮されないようなので、画面の解像度を変更している場合は座標と画面上の位置が噛み合わないことがあるので注意してください。
PyAutoGUI の利用例
ここでは、PyAutoGUI の利用の仕方や関数の呼び出し方のイメージを掴んでいただくために、簡単な例としてボタンをクリックするスクリプトを示していきたいと思います。
そのボタンをクリックするスクリプトの例が下記となります。まず、下記のスクリプトをコピペして Python スクリプトファイルとして保存してください。実行さえできればファイル名や保存先のフォルダはどこでも良いです。が、ファイル名を付けた方が解説しやすくなるので、ここでは下記スクリプトを 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.png
を button_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
機能とは異なる理由で例外が発生することになるため、ボタンを表示した状態でマウスカーソルを左上隅に移動させる必要があります。
これにより、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 が提供する関数を全て網羅しているわけではないので注意してください。また、引数も紹介しますが、こちらも指定機会の多いもののみの紹介となります。
具体的には、まず対象物の探索(画像認識)関連の関数として下記を、
- locateOnScreen:画面内から対象を探索する
- center:領域の情報から中心座標を求める
- locateCenterOnScreen:locateOnScreen + center
- locateAllOnScreen:探索した全領域の情報を取得する
- screenshoft:スクリーンショットを撮影する
続いて、マウス操作関連の関数として下記を、
- moveTo:マウスカーソルを指定した位置に移動する
- move:マウスカーソルを指定した距離だけ移動する
- position:マウスカーソルの位置を取得する
- click:クリック操作を行う
- mouseDown・mouseUp:マウスボタンを押す・離す
- dragTo:指定した位置までドラッグ操作を行う
- drag:指定した距離だけドラッグ操作を行う
最後に、キーボード操作関連の関数として下記を紹介していきます!
- write:文字列をキーボード入力する
- press:キーを押す
- keyDown・keyUp:キーを押し続ける・離す
- hotkey:複数のキーを同時に押す
locateOnScreen
:画面内から対象を探索する
まず1つ目に紹介するのが locateOnScreen
関数です。
この locateOnScreen
は、要は画像認識を行う関数で、パソコンの画面内から第1引数で指定した画像と一致する領域を探索し、一致した領域の情報を返却する関数になります。
PyAutoGUI でできること でも説明した、人間がパソコン上で作業する際に行う「画面を見る」と「対象の位置を認識する」は locateOnScreen
関数により代替することができます。なので、PyAutoGUI を利用する場合、結構頻繁に利用する関数になると思います。
仕組みとしては、locateOnScreen
関数内では画面のスクリーンショットが撮影され、そのスクリーンショットの中から引数で指定した画像と一致する領域を探索しているだけになります。
そのため、上手く動作させるためにはパソコンの画面内に引数で指定した画像が表示されている必要があります。
locateOnScreen
関数の使い方
続いて locateOnScreen
関数の基本的な使い方を説明しておきます。
PyAutoGUI の利用例 で locateOnScreen
関数の使用例を示したとおり、locateOnScreen
関数の第1引数には探索対象を撮影した画像のファイルパスを指定する必要があります。
さらに、locateOnScreen
関数は、その画像と一致する領域がパソコンの画面内に見つかった場合、その「領域の情報」を返却し、見つからなかった場合は None
を返却します。locateOnScreen
関数を実行する目的は、探索対象と一致する領域の情報を取得して次の手順(次の関数呼び出し)で利用することにありますので、基本的には返却値を受け取る形で関数呼び出しを行うことになります。
そのため、基本的な locateOnScreen
関数の実行例は下記のような形式となります。
import pyautogui
box = pyautogui.locateOnScreen('画像ファイルのパス')
パソコンの画面内に '画像ファイルのパス'
で指定した画像と一致する領域が見つかった場合、関数からは、その領域の情報が返却されることになります。
「領域の情報」とは、具体的には (left
, top
, width
, height
) の4つの要素からなるデータであり、(left
, top
) は一致した領域の左上座標、width
は一致した領域の幅、height
は一致した領域の高さとなります。
複数箇所に一致する領域が見つかった場合は、1つの領域の情報のみが返却されることになります。一致した領域の全ての情報を取得したい場合は、後述で紹介する locateAllOnScreen
を利用します。
locateOnScreen
の引数:confidence
続いて、locateOnScreen
関数の引数について紹介していきます。
locateOnScreen
関数の引数の中で一番重要になる引数が confidence
になると思います。
前述の通り、この 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
関数は、下記のように locateOnScreen
関数の返却値をそのまま引数に指定して実行することが多いです。
import pyautogui
box = pyautogui.locateOnScreen('画像のファイルパス')
x, y = pyautogui.center(box)
別に locateOnScreen
関数の返却値でなくても、(left
, top
, width
, height
) の形式のデータであれば引数に指定可能となります。
また、center
関数の引数に None
を指定した場合は例外が発生するという点に注意してください。上記のように center
関数を使用する場合、 locateOnScreen
の返却値が None
である、すなわち探索に失敗すると例外が発生することになります。
実は上記で実行している2つの関数の両方の機能を備え持つ関数が存在し、これを利用すれば1つの関数の呼び出しだけで上記の処理を実現することができるようになります。
スポンサーリンク
locateCenterOnScreen
:locateOnScreen
+ center
その関数が locateCenterOnScreen
となります。
locateCenterOnScreen
は、パソコンの画面内から第1引数で指定した画像と一致する領域探索し、一致した領域の中心座標を返却する関数になります。
つまり、locateCenterOnScreen
は locateOnScreen
に center
の機能を追加した関数となります。
locateCenterOnScreen
関数の使い方
locateCenterOnScreen
は、単に locateOnScreen
関数実行後に center
関数を実行するだけの関数であり、基本的に使い方は locateOnScreen
と同様になります。ただし、locateOnScreen
関数とは異なり、返却値は見つかった領域における中心座標の x
と y
になります。
また、引数に関しても locateOnScreen
と同じものが指定可能です。
import pyautogui
x, y = pyautogui.locateCenterOnScreen('画像のファイルパス')
locateAllOnScreen
:探索した全領域の情報を取得する
locateOnScreen
関数と locateCenterOnScreen
関数では第1引数で指定した対象画像と一致するスクリーンショット上の領域の情報が返却されますが、この時に返却される領域の情報は1つのみでした。
それに対し、 locateAllOnScreen
関数は、一致すると判断した領域の情報の全てを返却する関数になります。
そして、for
ループなどを利用することで、見つかった領域全てに対してクリック等の操作を行うことが可能となります。
locateAllOnScreen
関数の使い方
例えば下記は、button.png
の画像と一致する画面内の全ての領域の情報を取得し、その全領域の中心座標をクリックするスクリプトの例となります。基本的には PyAutoGUI の利用例 で紹介した1つのボタンをクリックする例を、複数ボタンをクリックするように変更したものになります。
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
にボタンの画像を指定すれば、画面内のボタン全てに対してクリック操作が行われることになります。
便利そうではありますが、locateCenterOnScreen
関数はちょっと使いにくいというのが私の印象です。
その理由の1つ目は minSearchTime
引数が指定できないことです。まぁただ、これに関しては、探索に成功するまで locateAllOnScreen
を繰り返し実行して自力で「待ち」を実現すれば良いだけではあります。
2つの目の理由が confidence
の調整が難しい点です。confidence
の値を下げて探索成功率を上げた場合、誤検出が多くなり、余計な領域の情報まで取得してしまうことになります。例えば、上のアニメの例でいえば、4つのボタンの領域だけでなく、もっと多くの領域の情報が取得できてしまい、4回以上のクリックが行われることになります。
かといって、confidence
の値を上げると探索に失敗することになりますし、この confidence
の調整が難しいという印象です。
screenshoft
:スクリーンショットを撮影する
screenshot
は画面のスクリーンショットを撮影する関数になります。返却値として、その撮影した画像の PIL 画像オブジェクトを取得することができます。
locateOnScreen
や locateCenterOnScreen
でも関数内部でスクリーンショットの撮影が行われることになりますが、内部で screenshot
関数が利用されて撮影が行われています。
screenshot
関数の使い方
引数なしで screenshot
関数を実行すれば画面全体のスクリーンショットを撮影することができます。
返却値は PIL 画像オブジェクトであり、ここでは詳細な解説は行いませんが、例えば画像のファイル保存・リサイズ・回転など、さまざまな画像に対する処理を行うことができます。
例えば下記は、画面全体のスクリーンショットを screen.png
というファイル名で保存する例になります。
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
関数は第1引数と第2引数(もしくは x
引数と y
引数)でマウスカーソルの移動先を指定して実行します。座標の原点は画面の左上隅となり、第1引数で指定する横方向の座標の正方向は右、第2引数で指定する縦方向の座標の正方向は下となります。
例えば下記を実行すれば、パソコンの画面上の (100
, 200
) 座標にマウスカーソルが移動することになります。返却値は常に None
となるため、返却値を受け取る必要はありません。
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
関数は第1引数と第2引数(もしくは xOffset
引数と yOffset
引数)でマウスカーソルを移動したい距離を指定して実行します。
距離の単位はピクセルで、第1引数で指定したピクセル数だけマウスカーソルが右方向に移動し、第2引数で指定したピクセル数だけマウスカーソルが下方向に移動することになります。負の値を指定すれば逆方向にマウスカーソルが移動します。
例えば下記を実行すれば、マウスカーソルが現在位置から左方向に 100
ピクセル、上方向に 200
移動することになります。
import pyautogui
pyautogui.move(-100, -200)
move
関数の引数:duration
moveTo
関数同様に引数 duration
が指定可能です。意味合いも同じなので、詳しくは moveTo 関数の引数:duration を参照してください。
moveRel
関数
実は、moveRel
という関数も PyAutoGUI に存在しますが、この関数は move
関数と全く同じものになります。
position
:マウスカーソルの位置を取得する
また、PyAutoGUI には position
関数が存在し、この関数で現在のマウスカーソルの位置を取得することができます。
position
関数の使い方
position
関数は引数なしで実行すると、返却値として現在のマウスカーソルの位置 (x
, y
) を取得することができます。したがって、例えば下記のように処理を実行した場合は moveTo(0, 0)
と同様の動作になります。
import pyautogui
x, y = pyautogui.position()
pyautogui.move(-x, -y)
スポンサーリンク
click
:クリック操作を行う
click
は名前の通り、マウスでのクリック操作を行う関数になります。クリックとは、要はマウスのボタンを押して離す操作となります。
click
関数の使い方
click
関数の一番簡単な使い方は下記になります。下記のように引数を指定せずに実行した場合、現在のマウスカーソルの位置に対してマウスの主ボタンでのクリックが一度だけ実行されます。主ボタンは、パソコンの利き腕設定等によって代わっている可能性がありますが、基本的にはマウスの左ボタンになります。
import pyautogui
pyautogui.click()
click
関数の引数:x
と y
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.LEFT
と clicks=1
を指定して click
関数が実行されることになります。その他の引数に関しては click
関数と同様のものを指定可能です。その他の関数にも同様のことが言えます。
mouseDown
・mouseUp
:マウスボタンを押す・離す
先程 click
関数の解説を行いましたが、クリックとはマウスのボタンを押して離す操作となります。
click
関数の場合、マウスのボタンを押す操作と離す操作が連続して行われることになりますが、これらは別々の関数で実行することも可能です。
マウスのボタンを押す操作を行うのが mouseDown
関数で、マウスのボタンを離す操作を行うのが mouseUp
関数になります。
mouseDown
関数と mouseUp
関数の使い方
使い方は click
関数に似ていて、要は第1引数と第2引数(もしくは x
引数と y
引数)でマウス操作を行う座標を指定して実行すれば、その座標でマウスのボタンを押す操作 or マウスのボタンを離す操作が行われることになります。また、第1引数と第2引数を指定しなかった場合、現在のマウスカーソルの位置で同様の操作が行われることになります。
例えば、下記のように処理を行えば、座標 (100
, 200
) でマウスのクリックが2回行われることになります。
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
は現在のマウスカーソルの位置から第1引数と第2引数(もしくは x
引数と y
引数)で指定された座標までドラッグ操作を行う関数となります。
dragTo
関数の使い方
感覚的には click
関数同様の使い方になると思いますが、dragTo
関数は “現在のマウスカーソルの位置” からドラッグ操作を行う関数なので、dragTo
関数を実行する前に、まずはドラッグしたい対象にマウスカーソルを合わせておく必要があります。なので、事前に moveTo
関数等でマウスカーソルの位置を移動させておく必要があります。
例えば下記は、target.png
に写っているアイコンのファイルを dst.png
に写っているフォルダにドラッグ操作で移動する手順を行う処理の例となります。
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
に写っているフォルダに対してドラッグ操作が行われることになります。
ポイントは、前述の通り、ドラッグ操作したい対象の位置に moveTo
関数を実行している点と、あとは、ドラッグ操作したい対象の位置とドラッグ先の位置を事前に求めておく必要がある点になると思います。上記では、2つの画像の位置を locateCenterOnScreen
関数を2回実行して求めています。
dragTo
関数の引数:duration
・button
dragTo
関数においては duration
や button
の引数が指定可能です。duration
に関しては moveTo 関数の引数:duration で、button
に関しては click 関数の引数:button で既に解説していますので詳しくはリンク先を参照していただければと思います。
これは Mac 限定の話になるかもしれませんが、なぜか dragTo
関数では button
引数を指定しないと例外が発生するようになっていました
より正確にいうと、button
引数を指定しないとデフォルトで pyautogui.PRIMARY
が button
引数に指定されるようになっているようですが、実際には内部で下記の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
ピクセルだけドラッグで移動を行う処理の例となります。
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
関数は第1引数にキーボード入力したい文字列を指定して実行すれば良いだけの関数になります。
ただし、何らかのアプリ等に対してキーボード入力を行いたいのであれば、事前にそのアプリにフォーカスを合わせておく必要があるので注意してください。例えば、テキストエディタに対してキーボード入力したいのであれば、まずテキストエディタをクリックしてフォーカスを合わせ、その状態で write
関数を実行する必要があります。
例えば、下記は editor.png
に写っているテキストエディタの位置を特定し、そのテキストエディタをクリックしてフォーカスを合わせ、さらにその後に、H
・e
・l
・l
・o
・
・W
・o
・r
・l
・d
・!
を順々にキーボード入力する例となります。interval
引数を指定することで、各文字の入力を行う際に間隔を 0.2
秒空けるようにしています。
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
関数は 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
関数を実行してやれば良いです。
import pyautogui
pyautogui.write('daeu[example.com', interval=0.2)
で、これは Mac Book の JIS キーボード利用時の話なので、使用するキーボードによって置き換え方を変更する必要があるかもしれないです。
また、Mac Book の JIS キーボード利用時の場合は置き換え自体が不可な文字もあります。具体的には「¥
」「|
」「_
」「]
」の4つになります。
¥
に関していえば、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
関数を実行すれば、ローマ字入力時と同じように日本語の入力を行うことは可能です。
press
:キーを押す
write
は引数で指定された文字列を順々に連続してキーボード入力する関数でしたが、ここから紹介する関数は1回分のキーボード操作を行う関数になります。
まず紹介するのが press
関数で、これは1つのキーを押す操作を行う関数になります。
press
関数の使い方
press
関数には、押したいキーのキー名を第1引数に指定して実行します。
例えば下記は、a
キーと b
キーと left
キーと c
キーを入力する例となります。結果的に、acb
という文字列が入力されることになります。
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
引数で指定可能です。
スポンサーリンク
keyDown
・keyUp
:キーを押し続ける・離す
press
が単にキーを押す関数であるのに対し、keyDown
はキーを押し続ける関数であり、keyUp
は押し続けているキーを離す関数になります。
例えば、shift
を押しながら他のキーを押すような操作も、keyDown
を利用することで実現可能となります。また、keyDown
を実行すると、指定したキーが押し続けられることになるため、適切なタイミングで keyUp
を実行することが重要となります。
keyDown
関数と keyUp
関数の使い方
keyDown
と keyUp
共に、第1引数にキー名を指定して実行します。それにより、keyDown
の場合はキー名に対応するキーが押し続けられ、keyUp
の場合はキー名に対応するキーが離されることになります。
指定可能なキー名は print(pyautogui.KEYBOARD_KEYS)
により確認可能です。
例えば下記は、shift
を押した状態で a
キーを押し、さらに shift
キーを離してから再度 a
を押す例となります。結果的には Aa
が入力されることになります。
import pyautogui
pyautogui.keyDown('shift')
pyautogui.press('a')
pyautogui.keyUp('shift')
pyautogui.press('a')
hotkey
:複数のキーを同時に押す
keyDown
を利用すれば複数のキーの同時押しを実現することは可能ですが、複数回 keyDown
関数を実行する必要がありますし、keyUp
関数でキーを離す処理も必要になってちょっと面倒です。
そのため、PyAutoGUI には hotkey
関数が用意されており、この関数で複数のキーの同時押しを簡単に実現することができるようになっています。
hotkey
関数の使い方
hotKey
関数では、複数のキー名を引数で指定することができます。そして、複数のキー名を引数で指定して hotkey
関数を実行した場合、引数の前方で指定するキー名のものから順にキーの押し下げが行われます。そして、全てのキーが押されたのちに、今度は引数の後方で指定するキー名のものから順にキーが離されていくことになります。
例えば下記は、command
と shift
と 3
のキーを同時押しする例となります(MacOSX でのスクリーンショットを行うキー入力となります)。
import pyautogui
pyautogui.hotkey('command', 'shift', '3')
ただ、私の環境では hotkey
関数は意図した通りに動いてくれないことが多かったです。確実に意図した通りに動かすためには、hotkey
関数を実行する前に下記のように keyUp
で 'command'
や 'shift'
のキーを離してから hotkey
関数を実行する必要がありました。
import pyautogui
pyautogui.keyUp('command')
pyautogui.keyUp('shift')
pyautogui.hotkey('command', 'shift', '3')
理由はちょっと謎なのですが、同様の現象が発生する方もおられるかもしれませんので、一応メモとして残しておきます。hotkey
関数が上手く動かないのであれば、面倒ですが keyDown
と keyUp
を利用してキーの同時押しを実現するのが良いかと思います。
PyAutoGUI が向いている自動化
最後に、今回紹介した PyAutoGUI が向いている自動化作業について説明しておきます。
前述の通り、パソコン上で行う作業の多くは PyAutoGUI によって自動化することが可能です。クリックしたいボタンやアイコン等の画面上の位置を locateOnScreen
関数等で取得し、その位置を click
関数等でクリックすることもできますし、write
関数等でキーボード入力などを行うことも可能です。
やろうと思えば、ウェブブラウザ上での操作や Excel 上での操作も PyAutoGUI で自動化することができます。とにかく汎用性が高いのが PyAutoGUI の魅力となるでしょう。
ただし、自動化はできるものの、PyAutoGUI を利用するのがベストであるかは自動化したい作業に依ります。例えば、ウェブブラウザ上の操作を自動化するのであれば、汎用的な PyAutoGUI を利用するよりも、ウェブブラウザの自動化に特化した Selenium を利用する方が楽に自動化できると思います。
また、Excel に関しても Excel 操作の自動化に特化した openpyxl を利用する方が楽だと思います。
要は、自動化したい作業に特化したライブラリがあるのであれば、そっちを利用する方が楽に自動化できるという話です。逆に、そういったライブラリが利用できない作業全般に PyAutoGUI は向いています。
おすすめ書籍(PR)
そういう意味で、自動化したい作業に合わせて使用するライブラリを適切に選択することが重要です。そして、こういった自動化を行う際に利用可能なライブラリの種類を知る上では、下記の 退屈なことはPythonにやらせよう 第2版 の参考書がオススメです。
この参考書では、今回紹介した PyAutoGUI だけでなく、前述で少し触れた Selenium や openpyxl などについても解説が行われています。ちなみに、このページでは解説しきれなかった PyAutoGUI の関数等も、退屈なことはPythonにやらせよう 第2版 では解説されています。
また、それだけでなく、PDF や Word、電子メール、画像等に関する自動化についても解説が行われており、自動化に利用できるライブラリを幅広く知るという意味で非常にオススメな参考書になります。1つ1つのライブラリに対する解説は薄めですが、ライブラリの存在を知っていれば、詳細な情報に関しては後でいくらでもネット上から拾うことができます。
序盤では Python の使い方やプログラミングについても解説されていますので、Python に慣れているから Python で作業効自動化・業務効率化を行いたいという人だけでなく、これらに興味がある Python 初心者の方にもオススメの参考書となります。
是非、日常の退屈な作業を自動化し、それによって自分の大切な時間を増やしていきましょう!
スポンサーリンク
まとめ
このページでは、Python のライブラリである PyAutoGUI について解説を行いました!
PyAutoGUI を利用することで、パソコン上で行う多くの作業を Python スクリプトから実行することができるようになり、これらの作業を自動化することができるようになります。
特に、パソコンの画面内から画像認識を行なって対象物の位置を取得したり、マウス操作・キーボード操作を行なったりできるため、PyAutoGUI は作業の自動化の観点においては非常に汎用性の高いライブラリになると思います。
もちろん自動化にも便利ですし、実際使ってみると自分が作ったプログラムがパソコンを支配しているように感じて面白さを感じることができると思います!
是非このページで学んだことを利用して、自身の作業の自動化や業務の効率化に活かしてみてください!