【初心者向け】PythonでWindowsの操作を自動化する方法【PyAutoGui】

※ 当サイトではアフィリエイト広告を利用しています。リンクは広告リンクも含みます。

この記事は約9分で読めます。
広告

PyAutoGuiを使ってWindows操作を自動化してみました。
普段操作してるマウス操作やキー操作を自動化するので
直観的に理解できPython初心者にも扱いやすく
実用的なライブラリです。
数個の命令の使い方が分かれば、
いろんなことが自動化できます。
まず参考になるYoutubeで基本を押さえていただき
初心者が、はまりそうなところを補足していきます。
Pythonの実行環境がパソコンに入ってない人は
無料で入れられるので調べて入れておいてください。

環境: Windows10, Anaconda, JupiterNotebook,Python 3
GoogleColabratoryではできないか、できても簡単ではない。
当記事のコードをJupiternotebookにコピペして使うと
’などが全角になるときがあります半角に直してください。

広告

Youtubeで基本をマスター

実際の動きを見ながら教えてくれるのでわかりやすいです。
Python解説動画_もなかさんの
【効率化】めんどくさい作業を完全自動化 PyAutoGUI完全マスター ~マウスクリックからキーボードタイピングまでPythonが全部代わりにやってくれます~
30分ですが必要なさそうなところは早送りしてみるとすぐ終わります。
Youtubeで早送りはキーボードの→キーを押すと5秒ごと先にスキップします。

PyAutoGui のメリット・デメリット

メリット

  • 普段のキー、マウス操作をプログラムに置き換えるのでわかりやすい。
  • 数個の命令(マウスを移動する。クリックする。キー入力)ぐらいを覚えるだけで、
    かなりのことができる。

デメリット

  • 操作対象のWindowを最前面に表示させておかなければいけないので他の作業ができない。
    (Youtubeなどで音だけ聞くことはできるが画面は見れない。)

実際に使用する際に初心者がはまること

上の動画を見ていただいた前提で話を進めていきます。
使用するライブラリ(importするもの)や
変数pagは上のYoutubeのものをそのまま使ってます。

思い通りの操作ができない。

アクティブ(最前面に出ている画面)なWindowが
JupiterNotebookなどになっているからです。
プログラムを実行して、ただ待っていても
JupiterNotebookに対して処理が実行されてしまいます。

ですのでプログラムを実行したらすぐに
処理したいWindowをアクティブ(最前面に持ってくる)にする必要があります。
またはプログラムの中でターゲットのソフトを起動する必要があります。
対策例3が1番実用的です。

対策例1:
プログラムの1番先頭に time.sleep(5)を書き5秒以内に
操作対象のWindowを最前面に表示させる。

対策例2:
Alt+Tabは現在開いているWindowが順番にアクティブになります。
キー操作でALT+Tabをやってみると動作が分かります。
なので操作対象のWindowを直前に表示させ
その後Jupiternotebookに戻って
以下をプログラムの先頭に書いた
プログラムを実行すれば操作したいWindowがアクティブになります。

time.sleep(1)
pag.hotkey("alt","tab")
time.sleep(3)

うまくいかないときはsleepの時間をのばすと動作が安定します。

対策例3:
プログラムを起動させる。
エッジの場合以下のコードで実行できます。(ファイルの場所はそれぞれ違う)

import subprocess
subprocess.run(r'C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe')

カッコの中はr’起動したいプログラムのある場所’と記述します。
起動したいプログラムのある位置は各プログラムを右クリックしてプロパティを表示させると
リンク先というところが場所になります。
それをコピペすればいいんですが。
そのままではエラーになります。
先頭にr(raw 文字列)をつけることでうまくできます。

Python学習におすすめ書籍!私はこれでPythonの基本を勉強しました。
(注意 PyAutoGui のことは書いてありません)

座標がよくわからない。

基本的にmoveToなど~To命令を使うようにしましょう。
~To命令で指定する座標は絶対座標なので画面の左上を原点に
固定した座標を指定することになります。
座標を指定する際、大事なのがWindowを最大化しておくことです。
中途半端な大きさのWindowに対して座標を指定しても
Windowの大きさが変わってしまえば座標も変わります。
なので最大で操作することを前提に座標を決めましょう。

座標の調べ方ですがYoutubeではMouseControlFunctionという
コマンドプロンプトで実行するプログラムを紹介しています。

Anacondaをインストールしている場合コマンドプロンプトは
Anaconda PowerShell Prompt を使います。

動画ではただコピペしてるように見えますが、よく見ると
python+Enterの次にコピペ(右クリックだけで貼りつく)です。
コピペしたら2回Enterで動画と同じように動作します。
終了はCTRL+Cです。

うまくいかなくても何とかなります。
以下のようなマウスのポジションを返してくれる命令だけ実行します。
命令の前には
sleepを入れて5秒の間に知りたいところにマウスを移動します。
その際、調べたいWindowは最大にし
JupiterNotebookはできるだけ小さくしておきます。
調べたいWindowの知りたい位置をJupiternotebookが上にあっても
見えるようにJupiternotebookの位置を変えておいてください。

time.sleep(5)
pag.position()

5秒後にマウスの位置が表示されます。
目次へ

batファイルで実行

上の座標表示のプログラムをダブルクリックで実行できるようにします。

Anacondaの場合Anaconda PowerShellではpythonを実行できるが
PowerShellでpythonが実行できなかったので
以下でpythonを実行できるようにしました。
https://www.python.jp/install/anaconda/windows/install.html#fraXt
batファイルは、そこに書いてあるコマンドを順次実行できるのですが
batファイルではPowerShellではなく
古いコマンドプロンプト(C:\WINDOWS\system32\cmd.exe)が立ち上がってしまい
pythonが実行できませんでした。
PowerShellのバッチ処理はps1ファイルというものらしく、
そこに書けばPowerShellでpythonが実行できる。
ただps1ファイルはダブルクリックでは実行できないので
ダブルクリックで実行できるbatでps1を実行する形にしました。

zahyou.bat(コマンドプロンプトbatファイル)
powershell ./zahyou.ps1
pause

zahyou.ps1(PowerShellバッチファイル)
python zahyoucheck.py

zahyoucheck.py(Pythonファイル)
import pyautogui, sys
print('Press Ctrl-C to quit.')
try:
    while True:
        x, y = pyautogui.position()
        positionStr = 'X: ' + str(x).rjust(4) + ' Y: ' + str(y).rjust(4)
        print(positionStr, end='')
        print('\b' * len(positionStr), end='', flush=True)
except KeyboardInterrupt:
    print('\n')

zahyou.bat、zahyou.ps1、zahyoucheck.pyを同一階層に作り
zahyou.batをダブルクリックするとリアルタイムでマウスの座標が表示されます。

こちらの方法だと効率よく座標を取得できます。

座標がずれている

ディスプレイ設定が原因だと思いますが上の方法で調べた座標をmoveToなどに入れて使うと、ずれる場合があります。
この場合指定した座標と実際に動いた座標を比較すると一定の比率でずれています。
なのですべての指定した座標を割るなり掛けるなりして補正して使うのが簡単です。

できるだけショートカットキーを使う

普段使わないとなじみがないですが
ショートカットキーを使ったほうが便利です。
例えば画面スクロールなどpag.scroll()を使うより
pag.press(‘pagedown’)を使ったほうが座標を指定しなくて済むので楽です。

止めたい(FaleSafe 機能)

実行中止めたい場合はマウスを画面の左上(0,0)に持っていけば
FaleSafe 機能が働いてエラーでプログラムが止まります。

しかし例えば座標100,100に30秒かけてマウスを移動したい場合
pag.moveTo(100,100,30)とすると
30秒間マウスのコントロールができません。
なので下のよう time.sleepを使って変更すると
29秒はマウスが自由に操作できるので
その間に0,0の座標にマウスをもっていけばフェールセーフ機能で
プログラムを止めることができます。

time.sleep(29) 
pag.moveTo(100,100,1)

止めたい(alertを使う)

alertを使ってアラートを表示しOKボタン待ちの状態にすると。
OKボタンを押したあと
JupiterNotebookに戻って停止ボタンでプログラムを止められる。
開発中は、alertをいっぱい使ってプログラムを止めながらやった方がいい。
プログラムを止めたあとアラート表示が残っているがOKを押せば消える。

pag.alert(text='一旦停止',title='状況',button='OK')

コピペがうまくいかない

どこかにキーを使ってコピペするとき

コピー
pag.hotkey("ctrl","c")
ペースト
pag.hotkey("ctrl","v")

全角モード(Windows右下の文字入力モードが「あ」)になってるとうまくいきません。
半角モード (Windows右下の文字入力モードが「A」)にしてプログラムを実行しましょう。

画像認識はあまり使わない方がいい?

個人的な意見ですが、locateCenterOnScreenは動作が不安定です。
私の場合だけかも?
使わなくてもできるので、
原因を調べるよりうまくいかない場合は早めに見切った方がいい。

目次へ
自動化の実践として以下2つ紹介します。

pythonを使ってWEB上で何かをしたい場合は最近出てきたPyscriptというものがあります。

Htmlの知識不要、PythonのみでWebに公開できるStreamlitもおすすめです。

MENTAやってます(ichige)

イチゲをOFUSEで応援する(御質問でもOKです)Vプリカでのお支払いがおすすめです。

Windows11で使えるか?

Windows11でもそのまま使えます。
私は、このパソコンでやっています。

コメント

タイトルとURLをコピーしました