白猫学生のブログ

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

PythonでGUI操作をしてみよう! AutoPy編


f:id:KevinArrow:20161024110837p:plain


はじめに


この前,PyAutoGuiというPythonGUI操作を行うモジュールを紹介させてもらいました.

PyAutoGUIでマウス操作などのGUI操作する方法 - 白猫学生のブログ

PyAutoGuiは非常に便利で,使いやすいところがメリットでしたが実はほかのモジュールでも同様のことが行えます.それがAutoPyです.
個人的な感想になってしまうのですが,汎用性や機能が豊富にあるのはPyAutoGuiで,実行速度を求めるならばAutoPyだと考えております.

今回はそのAutoPyの使い方について紹介します.
AutoPyとPyAutoGuiの違いはまた別の機会があれば紹介します.

[注意] 特に理由がなければPyAutoGuiの使用をお勧めします.AutoPyは使用者が少なすぎてWeb上に情報があまりありません



AutoPyとは


AutoPyとはGUI操作の自動化を行うためのツールキットです.キーボード操作,マウス操作,スクリーンショット(スクリーンキャプチャ)と認識,そしてアラート表示機能が含まれています.
PyAutiGuiと似たようなコードで同様の動作が行えますが,パッケージの中身は全く違うものになっています.



インストール方法


インストール方法は以下の通りです.

easy_install autopy

「pip」には対応していないので注意してください.
また,Python 2.5以上でないと動作しません.

もし,最新版をコンパイルしてインストールしたい方は以下の手順でインストールしてください.

git clone git://github.com/msanders/autopy.git
cd autopy
python setup.py build
python setup.py install



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

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

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

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

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

ディスプレイの解像度の取得方法

>>> width, height = autopy.screen.get_size() #ディスプレイの解像度を返す



マウスの操作方法

マウスカーソルの現在の座標の取得方法
>>> autopy.mouse.get_pos()  #現在のマウスのxとy座標を返す
(968, 56)
マウス操作

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

すぐに指定の座標に移動したい場合

>>> autopy.mouse.move(x, y)  # マウスカーソルを (x,y)の座標まですぐに移動する.

なめらかにに指定の座標に移動したい場合

>>> autopy.mouse.smooth_move(x, y)  # マウスカーソルを (x,y)の座標までなめらかに移動する.


マウス操作を用いたサンプルを最後においておきますので,参考にどうぞ.

マウスクリック

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

>>> autopy.mouse.clock(autopy.mouse.RIGHT_BUTTON)  #右クリック
>>> autopy.mouse.clock(autopy.mouse.MIDDLE_BUTTON) #真ん中クリック
>>> autopy.mouse.clock(autopy.mouse.LEFT_BUTTON) #左クリック



キーボードの操作方法

キーボードの入力する方法が以下のようになります.

>>> autopy.key.type_string('Hello world!\n', wpm = 0)  #文字列をキーボードで入力します. wpmは入力時間をあらわしています.デフォルトは0で最速入力になっています
>>> autopy.key.tap(autopy.key.K_F5) #F5をキーボードで入力する

ファンクションキーなどの文字では表せないキーは以下のサイトにかいてありますので,そちらを参考にしてください.

key — autopy module for working with the keyboard



アラートの表示方法

アラートを表示することで"OK"を押すまでプログラムを停止したり,情報を表示したりすることができます.
アラートの作成方法は以下の通りです.

>>> autopy.alert.alert("Hello, world!")

実行結果の例は以下の通りになります.
f:id:KevinArrow:20161024114848p:plain


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

スクリーンショットは以下の方法で取得することができます.

>>> screen = autopy.bitmap.capture_screen() #スクリーンショットを取得する
>>> autopy.color.hex_to_rgb(screen.get_color(2, 2)) #(2,2)の座標におけるRGB値を返す
(255, 255, 255) # (R G B)

>>> screen.get_color(2, 2) #デフォルトだと16進数でRGB値が返ってくる.
6777215

>>> screen.save("screenshot.png") #スクリーンショットの結果を保存



画像の読み込み・処理

画像の読み込みは以下の方法で行います.

>>> read_img = autopy.bitmap.Bitmap.open('read.png') #画像の読み込み
>>> read_img.save("read2.png") #画像の保存



サンプルプログラム

マウスカーソルでサイン波を描くサンプルプログラム

import autopy
import math
import time

TWO_PI = math.pi * 2.0
def sine_mouse_wave():
    """
    マウスが左画面から右画面までサイン波を描く
    """
    width, height = autopy.screen.get_size()
    height /= 2
    height -= 10 # Stay in the screen bounds.

    for x in xrange(width):
        y = int(height * math.sin((TWO_PI * x) / width) + height)
        autopy.mouse.move(x, y)
        time.sleep(0.001)

sine_mouse_wave()



ライセンス

AutoPyは"MIT License"と"The FreeBSD Documentation License"によって保護されているそうです.
ライセンスには詳しくないので内容はあまりわかりませんが,どちらのライセンスも著作権の表示と免責条項さえ示していれば個人利用,商業利用などに限らず,改変や再配布も自由にして良いそうです.ただし,自己責任でお願いします.


参考文献

今回は以下のサイトを参考にしています.

AutoPy



おわりに

最近はPyAutoGuiという便利なGUI操作用モジュールが出てきたのでAutoPyを使用することも少なくなりましたが,いまだにAutoPyを使うことがあるので記事にしました.
近いうちにPyAutoGuiとAutoPyの違いを記事にしたいと思います.