Pythonで自動化 PyAutoGUIの使いどころについて

プログラミング

概要

PyAutoGUIは、とてもお世話になっているPyAutoGUIなんですけど中心的に使うことは少ないのですよね。
私見ですけど、ほぼ何でもできますけどもっと違う方法を取ったほうが良い場合がありますのでその辺りを説明します。

なお、基本的な使い方はこちらです。

PyAutoGUIの基本
まずは、PyAutoGUIの基本をまとめます。これとpywinautoとかuiautomationとかと組み合わせると色々な事が出来ますよ。

なぜ要所でしか使わないか

なぜならば、面倒くさいから。
そして、コードの意味が分からないから。
実際のコードがどんな感じか見ていただければすぐわかると思います。

いろいろ工夫すれば何でもできるとは思いますが、それよりもほかのライブラリでは逆に難しいというときに使うのはとても効果的です。

たとえばSeleniumを使っていてログイン画面のダイアログボックスに入力するとか。
一部、ほかのライブラリでどうもやりづらいって時にはとても使えるときがあります。

百聞は一見に如かずなので、さっそくコード例を見てみます。

セルに入力するコード

下は、セルに1か所入力するコードを抜き出したものです。

        pag.press('f5')
        pag.hotkey('ctrl', 'a')
        pag.write('C')
        pag.press('tab')
        pag.press('tab')
        pag.hotkey('ctrl', 'a')
        pag.write('11')
        pag.press('enter')
        pag.press('f5')
        pag.press('f2')
        pyperclip.copy('C11 に書き込み')
        pag.hotkey('ctrl', 'a')
        pag.hotkey('ctrl', 'v'

 

“F5″キーでセルを指定して移動するダイアログがあるのでそれを使っています。
指定のセルへ飛ぶマクロを作ってそれを利用する方法もあるかと思いますが今回はCalcにある機能を使いました。

“F5″でこのようなダイアログが開きます。
これを使って”C11″セルへ移動します。
“Ctrl+A”でインプットボックスの全ての文字列を選択して列”C”を入力します。
“Tab”を2回押すと行を選択するインプットボックスへ移動します。
同様に行”11″を入力して”enter”で確定します。
ダイアログが表示されたままなので”F5″を押して隠します。
“C11″セルに移動しているので”F2″で入力モードへ移行して、
“Ctrl+A”ですべての文字を選択します。
この操作をしないとセルに文字列があった場合、元あった文字列に新しい文字列を付け加えることになります。
日本語は、そのまま入力できないのでpyperclipで一旦クリップボードへ文字列をコピーして
そこからさらにセルへ文字列をコピーします。

実際のコードの例 – Calcを起動してセルに2か所入力するだけの例

# -*- coding:utf-8 -*-
import time
from pathlib import Path

import pyautogui as pag
import uiautomation as auto
import pygetwindow as gw
import pyperclip

def bring_window_to_front(title):
    try:
        window = gw.getWindowsWithTitle(title)[0]  # 最初に一致するウィンドウを取得
        window.activate()  # ウィンドウを最前面に表示
        print(f"{title} が最前面に移動しました。")
    except IndexError:
        print("指定したウィンドウが見つかりませんでした。")
    except Exception as e:
        print(f"エラーが発生しました: {e}")
        
def get_window_position_and_size(title):
    try:
        window = gw.getWindowsWithTitle(title)[0]  # 最初に一致するウィンドウを取得
        left = window.left
        top = window.top
        width = window.width
        height = window.height
        return (left, top, width, height)
    except IndexError:
        print("指定したウィンドウが見つかりませんでした。")
        return None

# 使用例
if __name__ == "__main__":
    pag.hotkey('win', 'r')
    pag.write('scalc\n')
    #pag.PAUSE = 5 # うまくいかないです。
    time.sleep(10)
    
    title = "無題 1 — LibreOffice Calc"  # 対象のウィンドウタイトルを入力
    bring_window_to_front(title)
    
    # ウィンドウ位置とサイズを取得
    window_position = get_window_position_and_size(title)
    if window_position:
        x, y, w, h = window_position
        
        # ウィンドウ内のA1セルをクリックしてフォーカスを移動
        pag.click(x + 100, y + 10)  # ウィンドウ内のA1近くをクリック
        pag.press('esc', presses=2)  # Escで他のUI部品からフォーカスを外す
        pag.hotkey('ctrl', 'home')  # A1セルに移動
        
        pag.PAUSE = 0.5
        pag.press('f2')  # セル編集モードに入る
        pag.PAUSE = 0.5
        
        # テキストをクリップボードにコピーして貼り付け
        pyperclip.copy("A1 に書き込み")
        pag.hotkey('ctrl', 'a')
        pag.hotkey('ctrl', 'v')  # 貼り付け
        pag.press('enter')
        
        pag.press('f5')
        pag.hotkey('ctrl', 'a')
        pag.write('C')
        pag.press('tab')
        pag.press('tab')
        pag.hotkey('ctrl', 'a')
        pag.write('11')
        pag.press('enter')
        pag.press('f5')
        pag.press('f2')
        pyperclip.copy('C11 に書き込み')
        pag.hotkey('ctrl', 'a')
        pag.hotkey('ctrl', 'v')

 

もっと、短くできるかもしれませんがだいたいこんなコードになるかと思います。
後半のセルへの書き込み部分は、とても分かりづらいですよね。
そして、いろんな部品の特性に合わせて待ち時間を設けたりする必要があるので煩雑になったり全体的に動作が遅くなったりします。

まとめ

今回説明したのは、PyAutoGUIはほかのライブラリでは出来ない事を何とかしたいときに一部使ったほうが効果的ではないでしょうかという提案でした。

今回の様にLibreOffice Calcを自動操作するならサーバーモードを使ったりマクロを使ったりしたほうが楽に早く目的を達成できるかと思います。

いろんなライブラリを覚えるのは、それはそれで労力を使いますがそのほうがトラブルなども少なくなりますし結果的に楽なのではないでしょうか。

LibreOfficeのサーバーモードについて解説しています

LibreOfficeを使って印刷物(PDF)を作る方法 準備 3/4
LibreOfficeを利用してpythonから印刷する方法を解説します。これは帳票印刷などの基礎となります。今回は、スクリプトの解説となります。

LibreOfficeのPythonマクロについて解説しています

LibreOfficeのPythonマクロを使う
LibreOfficeでPythonのマクロを使うための準備と注意点、使い方を説明します。

Commnts