白猫学生のブログ

自分の趣味をひたすら投稿するブログ

PyAutoGUIでマウス操作などのGUI操作する方法

PyAutoGUIとは

PyAutoGUIとはWindowsMac等の各OSで同様のGUI操作を簡単に行えることを目的として提供されたPython用のモジュールです.
全部をまとめたわけではないですが,今回はよく使われる関数の使い方を説明します.

Python 2.7.11」で行いましたが,Python 3.x系列でも同様のコマンドで行えるそうです.


インストール方法

インストール方法はOSによって異なります.

Windowsの場合
pip install pyautogui
Mac(OS X)の場合
pip install pyobjc-core

pip install pyobjc

pip install pyautogui

Macの場合はインストールに時間がかかるかもしれません.


一般的な機能の説明と使い方

マウスカーソルの座標系の置き方

マウスカーソルの座標系は以下のように定義されています.

0,0(ディスプレイの左上)      
+---------------------------+
|  X -->                    | Y 
|                           | 
|   1920 x 1080 screen      | |
|                           | |
|                           | V
|                           |
+---------------------------+ 1919, 1079

ディスプレイの左上が原点(0,0)になり,そこから右側に行くほどxの値が上昇します.同様に,下に行くほどyの値が上昇します.
もし,マウスの座標がx, y = (1919, 1079)となったら左上から右に1919[pixel],下に1079[pixel]移動した場所になります.

マウスカーソルの現在の座標の取得方法
>>> pyautogui.position()  #現在のマウスのxとy座標を返す
(968, 56)
ディスプレイの解像度の取得方法
>>> pyautogui.size()  #ディスプレイの解像度を返す
(1920, 1080)
マウスカーソルが画面内に存在するか確認する方法
>>> pyautogui.onScreen(x, y)  # もし画面内にあればTrueを返す
True



フェールセーフの設定

フェールセーフとは

フェールセーフとはなんらかの装置・システムにおいて、誤操作・誤動作による障害が発生した場合、常に安全側に制御することです(Wikipediaより).今回はマウスやキーボードを直接操作することになるので,失敗するとPCに多大なダメージを与える可能性があるため,このような機能があるのだと思います.

GUI操作を行うごとにプログラムを一時停止する設定方法

GUIを操作するたびに,一定時間停止させることでユーザーからコマンドを受け付け,プログラムを緊急停止する時間を作成します.
(例えばプログラム停止中にCtrl+Cで強制停止する)

>>> pyautogui.PAUSE = 2.5

また,以下のコマンドでフェールセーフモードを有効にすることで,マウスカーソルが左上の位置にある場合にプログラムを停止することができます.
もし,プログラムを停止したい場合はマウスを左上の位置に持って行ってください.

>>> pyautogui.FAILSAFE = True # Falseで無効

デフォルトではこのフェールセーフモードが有効になっています.


マウスの操作方法

クリック操作

マウスカーソルの移動方法は以下の2通りあります.

>>> pyautogui.moveTo(x, y, time)  # マウスカーソルを (x,y)の座標までtime秒で移動する.もしtime=0であればすぐに移動する.
>>> pyautogui.moveRel(xOffset, yOffset, time)  #現在のマウスカーソルの座標から(xOffset,yOffset)だけtime秒で移動する.

マウスクリックを行いたい場合は以下の方法で行います.

>>> pyautogui.click(x, y, clicks, interval, button)

(x,y)の座標でClick数だけクリックします.また,intervalはクリック間の時間を表し,buttonはボタンの種類を表します.
ボタンの種類は「左クリック」,「中央クリック」,「右クリック」の3つあります.

もし,マウスカーソルを(50,100)の座標で0.5秒間ずつ2回,左クリックを行いたい場合は以下のように書きます.

>>> pyautogui.click(50, 100, 2, 0.5, 'left')

クリックの設定が面倒であれば以下の関数があらかじめ準備されています.

>>> pyautogui.rightClick(x,y)  #右クリック
>>> pyautogui.middleClick(x,y) #真ん中クリック
>>> pyautogui.doubleClick(x,y) #ダブルクリック
>>> pyautogui.tripleClick(x,y) #トリプルクリック

ドラッグは以下の方法で行えます.
(注意:Macではtime = 0でのドラッグはできません)

>>> pyautogui.dragTo(x, y, time)  #現在のマウスカーソルの座標から(x,y)の座標までtime秒でドラッグする.
>>> pyautogui.dragRel(xOffset, yOffset, time)  # 現在のマウスカーソルの座標から(xOffset,yOffset)だけtime秒でドラッグし移動する

もし,マウスボタンを押したときと離した時を使い分けたい場合は以下の方法で行えます.

>>> pyautogui.mouseDown(x, y, button='left')
>>> pyautogui.mouseUp(x, y, button='left')
スクロール操作

スクロールを操作したい場合は以下の方法で行えます.

>>> pyautogui.scroll(amount_to_scroll, x, y)

amount_to_scrollはスクロール量で,ほかの引数はマウスカーソルのx座標とy座標を表しています.


キーボードの操作方法

キーボード入力

キーボードの入力する方法が以下のようになります.ここまで準備してくれると本当に便利で助かります(笑)

>>> pyautogui.typewrite('Hello world!\n', interval)  # intervalは文字間の入力待機時間です.
>>> pyautogui.typewrite(['a', 'b', 'c', 'left', 'backspace', 'enter', 'f1'], interval) #配列にも対応しています.

配列で入力するとファンクションキーやバックスペースなどがキーボード入力と同時に扱うことができます.

キーボードの対応しているリストは

pyautogui.KEYBOARD_KEYS

で全部表示することができます.量が多いのでここに載せることができませんので,コマンドラインなどで確認してください.
「こんなのも対応してるんだ~」ってのもあって意外と驚きます.

マウスと同様にキーボードを押したときと離したときを別々に使いたい場合は

>>> keyDown(key_name)
>>> keyUp(key_name)

で使い分けることができます.

ショートカットキーの入力

Ctrl + C(コピー)などのショートカットキーを使いたい場合は以下の方法で使うことができます.

>>> pyautogui.hotkey('ctrl', 'c')  # ctrl-c コピー
>>> pyautogui.hotkey('ctrl', 'v')  # ctrl-v ペースト

もちろん,Ctrl-sのショートカットキーで保存したりすることもできます.


メッセージボックスの作成方法

メッセージボックスを作成することで"OK"を押すまでプログラムを停止したり,情報を表示したりすることができるようになります.
メッセージボックスの作成方法は以下の通りです.

>>> pyautogui.alert('This displays some text with an OK button.')
>>> pyautogui.confirm('This displays text and has an OK and Cancel button.')
'OK'
>>> pyautogui.prompt('This lets the user type in a string and press OK.')
'Hello World'

実行結果の例は以下の通りになります.
alertはOKのボタンだけ,confirmはOKとCancelのボタン,promptは入力画面があります.

f:id:KevinArrow:20160627000338p:plain
alertの例

f:id:KevinArrow:20160627000337p:plain
confirmの例

f:id:KevinArrow:20160627000335p:plain
promptの例


スクリーンショットの方法

Pillow/PILを用いてスクリーンショットを取ることができます.

>>> pyautogui.screenshot()  # Pillow/PILの画像イメージを返します.
<PIL.Image.Image image mode=RGB size=1920x1080 at 0x24C3EF0>
>>> pyautogui.screenshot('foo.png')  # スクリーンショットの画像を保存します.
<PIL.Image.Image image mode=RGB size=1920x1080 at 0x31AA198>

PyAutoGUIでは保存までの関数は準備されています.保存後の処理を行う場合はPillow/PILの使い方を参考にしてください.
(注意:Linuxでこの関数を使用する場合はあらかじめ「sudo apt-get install scrot」をして必要なライブラリをインストールしておいてください.)


おわりに

この記事を書くのに思った以上の時間を取られて疲れた...
もともと自分用のまとめの意味を込めて記事を作りましたが,少しでも誰かのお役に立てれば幸いです.