【簡単Python】画面操作ライブラリ「PyAutoGUI」をマルチモニターに対応させるシンプルな方法



いつもありがとうございます!
ノンプログラマー向け「Python解説シリーズ」へようこそ。
本稿では、「画面操作ライブラリ "PyAutoGUI" をマルチモニターに対応させるシンプルな方法」を解説します。
PyAutoGUI は、画面上の操作を 自動化するためのPythonの定番ライブラリです。マウスやキーボードの操作、スクリーンショットの取得など、人が手作業で行っていた操作を自動化できる非常に便利なライブラリです。
しかし、この PyAutoGUIには、ひとつ欠点があります。それは、マルチモニターに対応していないことです。マルチモニター環境での作業が当たり前になってきている昨今、この制限は無視できません。
「なんとかマルチモニターに対応させられないか ──」
そんな課題を抱える方に向けて、シンプルで具体的な解決方法をお届けします。
Python を活用して、自身やコミュニティに適した改善ツールを作成し、仕事量は半分に、成果は 2 倍にしていきましょう。初心者の方にも理解しやすいよう、分かりやすく解説していきます。ぜひ、ご覧ください。
Pythonの画面操作ライブラリ「PyAutoGUI」をマルチモニタに対応させるシンプルな方法

前提の画面構成
下図のようなモニター構成を例にとります。メインモニター1の左側にサブモニター2が接続されています。

まず、PyAutoGUI の通常の挙動を確認
まずは、PyAutoGUI の通常の挙動について解説します。分かりやすく示すために、画面のスクリーンショットを取得し、画像ファイルとして保存するシンプルなコードを例として取り上げます。以下のコードをご覧ください。
# ライブラリのインポート
import pyautogui
if __name__ == '__main__':
# スクリーンショットを保存
pyautogui.screenshot('screenshot.png')このコードを実行すると、保存された画像は次のようになります。サブモニターが接続されているにもかかわらず、メインモニターの画像のみがキャプチャされます。

このように、PyAutoGUI は、マルチモニターに対応していません。
PyAutoGUI をマルチモニターに対応させる方法
次に、PyAutoGUI をマルチモニターに対応させる方法を解説します。同様に、画面のスクリーンショットを取得し、画像ファイルとして保存するコードを例として取り上げます。以下のコードをご覧ください。
# ライブラリのインポート
import pyautogui
from PIL import ImageGrab
def grab_path(*args, **kwargs):
kwargs["all_screens"] = True
return _original_grab(*args, **kwargs)
if __name__ == '__main__':
# 元のImageGrab を取得
_original_grab = ImageGrab.grab
# ImageGrab.grab を grab_path に置き換え
ImageGrab.grab = grab_path
# スクリーンショットを保存
pyautogui.screenshot('screenshot_all_monitors.png')このコードを実行すると、次のようにサブモニターを含む画面全体のスクリーンショットが保存されます。


解説していきます。
# ライブラリのインポート
import pyautogui
from PIL import ImageGrabここでは、スクリーンショットを取得するために必要なライブラリを読み込んでいます。
- PyAutoGUI
マウス操作、キーボード操作、画面のキャプチャなどを行うためのライブラリです。 - ImageGrab
PyAutoGUIの内部で使われている画面キャプチャ専用のライブラリです。つまり、PyAutoGUIは、ImageGrab を使用して画面キャプチャ処理を行っています。
def grab_path(*args, **kwargs):
kwargs["all_screens"] = True
return _original_grab(*args, **kwargs)ここでは、ImageGrab.grab() に対して、マルチモニター対応の設定を強制的に追加する関数grab_path()を定義しています。
この関数は、もともとの ImageGrab.grab() に渡される引数をすべて受け取り、それをそのまま渡し直す構造になっています。
*argsは、「位置引数」(キーワードを付けずに渡される引数)をまとめて受け取る記法です。たとえばgrab(100, 200)のように、何の名前もつけずに渡される引数が該当します。**kwargsは、「キーワード引数」(名前を付けて渡される引数)をまとめて受け取る記法です。たとえばgrab(all_screens=True)のように、キーワードをつけて渡される引数はここに入ります。kwargs["all_screens"] = Trueは、関数が呼び出されたときにどんな引数が渡されていても、all_screens=Trueという設定をあとから強制的に追加するという意味です。例えば、すでにall_screensが設定されていても、ここで強制的にTrueに上書きされます。_original_grab(*args, **kwargs)は、元のImageGrab.grab()関数を呼び出す部分です。変更した引数(all_screens=Trueを加えた状態)を使って、画面キャプチャ処理を実行しています。
このようにして、grab_path() は「全モニターをキャプチャするようにした、ImageGrab.grab() の代わり」として機能します。
if __name__ == '__main__':
# 元のImageGrab を取得
_original_grab = ImageGrab.grab
# ImageGrab.grab を grab_path に置き換え
ImageGrab.grab = grab_path
# スクリーンショットを保存
pyautogui.screenshot('screenshot_all_monitors.png')ここでは、先ほど定義した grab_path() を実際に使うための準備と、スクリーンショットの保存処理を行っています。
if __name__ == '__main__':は、「このファイルが直接実行されたときだけ、以下の処理を行う」という意味の Python の基本構文です。他のスクリプトにインポートされたときには実行されません。_original_grab = ImageGrab.grabは、元の関数を一時的に変数に保存するための処理です。あとで元に戻すための準備です。ImageGrab.grab = grab_pathによって、画面キャプチャ処理をgrab_path()にすり替えています。これにより、PyAutoGUI のスクリーンショット機能がマルチモニター対応になります。pyautogui.screenshot('screenshot_all_monitors.png')は、マルチモニター全体のスクリーンショットを取得し、ファイルとして保存する処理です。
このようにして、PyAutoGUIをマルチモニターに対応させることができます。
PyAutoGUIの設定を元に戻すには
上述のマルチモニターに対応させる方法は、ImageGrab の動作を書き替えているため、他のコードやライブラリが ImageGrab を使っている場合、意図しない挙動になる可能性があります。そのため、必要な処理が終わったら、元の(デフォルトの)状態に戻したい場合には、次のように記述します。
# ライブラリのインポート
import pyautogui
from PIL import ImageGrab
def grab_path(*args, **kwargs):
kwargs["all_screens"] = True
return _original_grab(*args, **kwargs)
if __name__ == '__main__':
# 元のImage.Grab を取得
_original_grab = ImageGrab.grab
# ImageGrab.grab を grab_patch に置き換え
ImageGrab.grab = grab_path
try:
# スクリーンショットを保存
pyautogui.screenshot('screenshot_all_monitors.png')
finally:
# 元の ImageGrab.grab に戻す
ImageGrab.grab = _original_grab

以上で解説は終了です。
Python プログラミングスキルアップのための参考情報
ここでは参考図書を紹介いたしますが、これに限らず自分に合うものを選ぶことが重要だと考えております。皆様の、より一層のご成功を心からお祈りしております。
「独学プログラマー」というPythonを題材にした書籍は大変勉強になりました。Pythonの技術解説だけにとどまらず、プログラミングの魅力や基本的な知識、思考法、仕事の進め方まで幅広く学べます。
こちらの記事でも紹介しております。もしよろしければご覧ください。
また、Pythonに関する書籍は多数出版されています。興味のある方は、チェックしてみてください。
\チェックしてみよう/
\チェックしてみよう/
\チェックしてみよう/

おわりに


ご覧いただきありがとうございました!
本稿では、「画面操作ライブラリ "PyAutoGUI" をマルチモニターに対応させるシンプルな方法」を解説いたしました。
お問い合わせやご要望等ございましたら、「お問い合わせ/ご要望」フォームまたはコメント欄よりお知らせください。
この記事が皆様のお役に立てれば幸いです。
なお、当サイトでは様々な情報を発信しております。よろしければトップページもあわせてご覧ください。
この記事を書いた人
- ソフトデザイン工房|日々の業務にちょうどいい自動化を
- ■人生を追求する凡人 ■日本一安全で、気の向くままに自分の時間を過ごせる、こだわりのキャンプ場を作るのが夢 ■ソフトデザイン工房運営(個人事業者) - 業務改善アプリケーションをご提供 ■人生は時間そのもの。ひとりでも多くの人が「より良い人生にするために時間を使って欲しい」と願い、仕事のスキルの向上、余暇の充実、資産形成にチャレンジ。





