2016年5月15日日曜日

GUI自動化ライブラリの使い方のまとめと利用例[Python]

この所スランプ気味でして,気分転換に久しぶりの更新です.

1.GUI自動化について

普段PCを使っていて,単純作業やゲームなどを自動化したいと思うことは結構あるかと思います(チートはダメだよ).

ExcelなどではVBAでマクロを書くことが出来るのですが,それ以外の場合については大抵GUI自動化ライブラリを使って自分でプログラムを書くのが一般的かと思います.

有用に使う例は多々あるのですが,ただ遊ぶだけでもそこそこ楽しいです.頑張ればこんなこともできちゃいます.


自分は普段PyAutoGUIというPythonのライブラリを使っているのですが,日本語で使い方を書いたサイトが少なく,毎回英語の公式ドキュメントをGoogle翻訳片手に読むのはつらいのでブログにまとめることにしました.

2.PyAutoGUIの関数使い方のまとめ

自分が普段使うときに使う関数のまとめです.これである程度使いこなすことは出来るかと思います.

このプログラム自体に意味は無いので実行しないようにしたほうが良いかと思います.

ちなみに間違えて作ったプログラムで暴走した時は左上にカーソルを移動すると例外が発生して止まるようになっています.

import pyautogui as pa

"""
参考:PyAutoGUI公式ドキュメント
[1] Welcome to PyAutoGUI’s documentation! — PyAutoGUI 1.0.0 documentation
    https://pyautogui.readthedocs.io/en/latest/
[2] PyAutoGUI Documentation
    https://media.readthedocs.org/pdf/pyautogui/latest/pyautogui.pdf
"""

if __name__=="__main__":
    # 画面の幅と高さを取得する関数
    w,h = pa.size()
    
    # マウスカーソルの位置を取得する関数
    mouseX,mouseY = pa.position()
    
    # クリック
    pa.click()
    
    # click関数詳細
    pa.click(
        x = 200,y = 200,    # 座標
        clicks = 2,            # クリックの回数
        interval = 0.25,    # クリック間のインターバル
        button = "left",    # マウスのボタン(left,middle,rightの3つ)
        duration = 0.05        # 長押しするかどうか    
    )
    # マウスカーソルの移動(左上を(0,0)とする)
    pa.moveTo(x=100,y=200,duration=0.0)
    
    # マウスカーソルの移動(現在の位置を(0,0)とする)
    pa.moveRel(xOffset=20,yOffset=20,duration=0.0)
    
    # ドラッグ(左上を(0,0)とする)
    pa.dragTo(x=100,y=300,duration=0.0,button="left")
    
    # ドラッグ(現在の位置を(0,0)とする)
    pa.dragRel(xOffset=10,yOffset=30,duration=0.0,button="left")
    
    # マウスの押下(押したまんまになる)
    pa.mouseDown(x=200,y=300,button="left")
    
    # マウスの押下の取り消し
    pa.mouseUp()
    
    # スクロール(上に移動するのが正)
    pa.scroll(clicks=100,x=100,y=100)
    
    # 文字の打ち込み
    pa.typewrite("Hello, World!",interval=0.0)
    
    # 指定したキーを押す
    pa.press(keys="enter",presses=2,interval=0.0)
    
    # 指定したキーを押したまんまにする
    pa.keyDown("shift")
    
    # 指定したキーを離す
    pa.keyUp("shift")
    
    # 複数のキーを同時に押す
    pa.hotkey("ctrl","f")
    
    # スクリーンショット(ファイルに保存,範囲指定)
    # imageFilename,regionは指定しなくても良い
    img = pa.screenshot(
        imageFilename="screenshot.png",    # 保存先ファイル名
        region=(20,20,100,100)    # 撮影範囲(x,y,width,height)
    )
    
    # 指定した画像がスクリーン上のどこにあるかを探す関数
    # 一致箇所をすべて探してタプル(x,y,width,height)の配列で返す
    pos_list = pa.locateAllOnScreen(img)
    
    # ファイル名で与えることも出来る
    pos_list = pa.locateAllOnScreen("screenshot.png")
    
    # 一箇所見つかればよいのならばlocateOnScreen
    pos = pa.locateOnScreen("screenshot.png")


"""
keyDownで指定できるキー一覧
['\t', '\n', '\r', ' ', '!', '"', '#', '$', '%', '&', "'", '(',
')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '_', '`',
'a', 'b', 'c', 'd', 'e','f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~',
'accept', 'add', 'alt', 'altleft', 'altright', 'apps', 'backspace',
'browserback', 'browserfavorites', 'browserforward', 'browserhome',
'browserrefresh', 'browsersearch', 'browserstop', 'capslock', 'clear',
'convert', 'ctrl', 'ctrlleft', 'ctrlright', 'decimal', 'del', 'delete',
'divide', 'down', 'end', 'enter', 'esc', 'escape', 'execute', 'f1', 'f10',
'f11', 'f12', 'f13', 'f14', 'f15', 'f16', 'f17', 'f18', 'f19', 'f2', 'f20',
'f21', 'f22', 'f23', 'f24', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9',
'final', 'fn', 'hanguel', 'hangul', 'hanja', 'help', 'home', 'insert', 'junja',
'kana', 'kanji', 'launchapp1', 'launchapp2', 'launchmail',
'launchmediaselect', 'left', 'modechange', 'multiply', 'nexttrack',
'nonconvert', 'num0', 'num1', 'num2', 'num3', 'num4', 'num5', 'num6',
'num7', 'num8', 'num9', 'numlock', 'pagedown', 'pageup', 'pause', 'pgdn',
'pgup', 'playpause', 'prevtrack', 'print', 'printscreen', 'prntscrn',
'prtsc', 'prtscr', 'return', 'right', 'scrolllock', 'select', 'separator',
'shift', 'shiftleft', 'shiftright', 'sleep', 'stop', 'subtract', 'tab',
'up', 'volumedown', 'volumemute', 'volumeup', 'win','winleft', 'winright', 'yen',
'command', 'option', 'optionleft', 'optionright']
"""

幾つかマニアックな機能などは書きませんでしたが,この程度あれば十分いろんなことが出来るかと思います.


3.実際に使ってみる

関数の使い方だけではつまらないのでちょっと上の関数を使って遊んでみた例を書いてみます.

(あ,一応上で述べたミクのやつはここにコードが貼ってありますがPyAutoGUI以外の知識がいるのであまりオススメではないです)


とりあえずペイントで四角を書くプログラムです.本当はpa.locateOnScreen("画像ファイル")で座標を取り出してボタンをクリックするみたいな処理を入れたいのですが,画像がないと実行できないのでこれで妥協です.
import pyautogui as pa
import time

if __name__=="__main__":
    # 起動してすぐに実行されると困るので5秒待つ
    time.sleep(5)
    
    # 現在の位置を取得する
    x0,y0 = pa.position()
    
    # PyAutoGUIの各動作の間隔を0.1秒に指定
    pa.PAUSE = 0.1
    
    n = 256
    # マウスを押して
    pa.mouseDown(button="left")
    for i in range(n)[::16]:
        # 左上,右上,右下,左下,左上と移動してみる
        pa.moveTo(x0 , y0)
        pa.moveTo(x0 + i , y0)
        pa.moveTo(x0 + i , y0 + i)
        pa.moveTo(x0 , y0 + i )
        pa.moveTo(x0 , y0)
    # マウスを戻す
    pa.mouseUp()
またなんか作ったら記事書きます.


4.参考

公式ドキュメント.割とわかりやすくまとまっています.
Welcome to PyAutoGUI’s documentation! — PyAutoGUI 1.0.0 documentation
https://pyautogui.readthedocs.io/en/latest/

公式ドキュメントのPDF.一度に見れるので良いです.
PyAutoGUI Documentation
https://media.readthedocs.org/pdf/pyautogui/latest/pyautogui.pdf