見出し画像

[python]PyAutoGUIでスクリーンショットを撮ったらものすごく高機能になった件

 PyAutoGUIでRPAの環境を構築しようとすると、作業した際のスクリーンショットを撮る機会というものが結構多いものです。今回はその撮り方をご紹介します。
 <検証環境>
OS:Windows11 64bit(10でも検証済み)
python:3.8.5
PyAutoGUI:0.9.53
※今回もWindows11でしっかり動いてくれています。

画面全体のスクショ取得はズバリ1行で取得可能

#pyautoguiをインポート
import pyautogui as pag

#これだけ
#ファイルパスやファイル名を指定する。
pag.screenshot('test.png')

特定のウィンドウを取得したい場合

 画面全体を取得しても全然OKですが、何か作業をしたり、設定したウィンドウのみのスクショを取得したい場合もあります。その場合は少し工夫が必要です。
 詳しい手順は下記のサイトによく載っていました。

 このサイトにも掲載されているとおりですが、PyAutoGUIは・・・

ウィンドウ操作系の関数(コマンド)を持っていません。これには色々理由があると思うのですが、恐らく、OS間(GUI)の互換性を維持するためというのもあると思います。

楽しい生産性ブログ様より

 ということらしいです。よって今回はPyGetWindowパッケージを使いましょう。イメージとしては、
まず「PyAutoGUI」で必要な設定をする

次に「PyGetWindow」で必要なウィンドウのスクショを撮る

 というような流れになります。

PyGetWindowを使う

#まずインポートします。
import pygetwindow as gw

 次にウィンドウの名前を調べる必要があるのですが、ここはちょっとpythonを離れて、inspect等のツールを用いてウィンドウ名を確認する必要があります。分かりやすいウィンドウ名だからといっても、ウィンドウ名に半角スペースが入っていたりすると動かない場合もあるので、正確に把握する必要があるわけです。

左が取得したいウィンドウ、右がinspctで確認したウィンドウ名。inspectで表示された箇所をコピペして使用することで正確なウィンドウ名の取得ができる。

inspectとは?という人は以下のサイトなどもご参照ください。

  ウィンドウ名が確認できましたら下記のようなコードでウィンドウのスクショを取得できます。

#●●のところにウィンドウ名を記入。[0]
window= gw.getWindowsWithTitle('●●')[0]

#スクリーンショットを保存したいウィンドウをアクティブにする。
window.activate()

#左端のスクリーン座標x,yを取得
x,y=window.topleft

#ウィンドウの幅と高さを取得
width,height=window.size

#アクティブウィンドウのスクリーンショットを撮る。●●のところにはファイルパスを記入。
screenshot=pag.screenshot('●●'),region=(x,y,width,height))

 ここで、window= gw.getWindowsWithTitle()[0]の[0]とは何でしょうか?「楽しい生産性ブログ」様に分かりやすい説明がございましたらので引用いたします。


getWindowsWithTitle()関数は、最初に述べた通りウィンドウのタイトルからウィンドウを特定する関数です。(中略)
では、[0]というのはなんでしょうか?
実は、getWindowsWithTitle関数は、複数のウィンドウが見つかったら複数のウィンドウの情報を結果とします(結果や値を[返す]、と言います)。メモ帳も複数のウィンドウを起動できますよね?
そういう複数の値・結果を返す関数は、通常配列で結果を返します。先ほど説明した通り、配列は「複数の数字や文字列をひとまとまりにする方法」です。画面に表示するときは[]に囲まれて、,で区切られています。
その配列の中から、一つの値(要素)を取り出すときに使うのが、[]角括弧の中に数字を入れる、[0]のような記法となります。

 python的な言い方ですといわゆる「リストから要素を取得する」です。コードで書くとこうなります。

#[]で囲まれて,で仕切られたものがリスト。
list=['test1','test2','test3']

#list[0]を指定すると、test1を取得できる。
#list[1]を指定すると、test2を指定できる。
list[0]


 プログラミングではたいてい1番目は「0」から始まります・・・。まあ最初はあまり気にせず「こういう書き方なんだな~」程度の理解でも大丈夫だと思います。

おまけ:ファイルパスの指定

 ちなみにファイルパスの取得はとても簡単です。直接書いてもいいのですが、今回はos.path.joinをご紹介します。
 os.path.join()については下記のサイトが分りやすかったです。勉強させてもらいました。


 よくあるケースとして、現在のフォルダに新しいファイルを追加・保存する場合も多いのではないでしょうか。そんな時には以下のようなコードになります。

#OSモジュールをインポート。
import os

#現在のフォルダを第一引数、新しいファイル名を第二引数に指定する。
#os.getcwd()で現在のフォルダを指定。
os.path.join(os.getcwd(),'test01.png')

 また、リストにフォルダ名とファイル名をまとめることでパスを指定することもできます。

import os

#リストでフォルダとファイル名を指定します。
file=['picture','test','test.png']

#*をつけて変数を指定します。
#picture\test\test.pngといった形でパスが指定できます。
os.path.join(*file)

終わりに

 いかがでしたでしょうか。PyAutoGUIだけではできないことでも、それ以外のパッケージやモジュールを活用することで柔軟にスクショを撮ることができました。
 ところで取得したスクショですが、保存して終わりではちょっとつまらないですよね?何か活用できれば?そんな思いもありますので、いずれその活用方法なども検討してみたいと考えています。

この記事が気に入ったらサポートをしてみませんか?