Warning: Undefined array key "options" in /home/c1397404/public_html/ict-worker.com/wp-content/plugins/elementor-pro/modules/theme-builder/widgets/site-logo.php on line 192

Python の RPA で「名前を付けて保存」の確認を攻略する

FacebooktwitterredditpinterestlinkedinmailFacebooktwitterredditpinterestlinkedinmail

Python 初心者から始める RPA。今回は、RPA でよく使う「名前を付けて保存」の攻略します。また、プログラミングで非常に重要な 条件判断と分岐、略して条件分岐を Python で記述できるように学習します。

この記事は、RPA で今の仕事を楽に・効率的にしたい、人気のプログラミング言語 Python を学習して副業や転職に繋げる連載企画の一部です。有料・ノーコード RPA よりも当然、難易度は高くなっていますが、その分学習すると色々なことに応用が利きますよ。

この記事の内容
  • PyAutoGUI でアクティブなウィンドウの名前を取得する方法
  • Python で条件分岐を行う方法
  • RPA でアクティブなウィンドウによって実行する内容を切り替える方法
  • 「名前を付けて保存の確認」ダイアログを攻略する

Pythonのインストールから学習したい場合は、本連載第一回を参照してください。

Python で RPA でプログラムを学ぶその1. PyAutoGUIを試す

Python でアクティブなウィンドウを取得する

RPA で「名前を付けて保存の確認」の何が厄介か? というと、出たり出なかったりすることですね。もちろん、上書き保存の活用や絶対に重複しないファイル名といった対応方法もありますが、そういった対処ができない場合もあります。また、「名前を付けて保存の確認」に限らず、Windows, アプリの状態で処理を切り替えたくなる状況は、いずれ発生します。

ということで、名前を付けて保存の確認ダイアログが出てしまったか? を確認するにはどうするか。まずはアクティブなウィンドウを取得することですね。アクティブなウィンドウを取得するには、PyGetWindow が手軽です。

使用する関数は、getActiveWindowとなります。

import pygetwindow as gw
import time

time.sleep(1.5)
active_window = gw.getActiveWindow()
print(active_window.title)

上記のスクリプトを、pythonファイルとして保存します。コピー&ペーストでもいいですが、できれば手で入力してくださいね。簡単なスクリプトでも、1文字1文字手打ちすると学習効果が高まります。プログラミングの世界では、これを仏教になぞらえて写経といったりします。

実行は、スクリプトファイルをダブルクリックではなく、コマンドプロンプトから

py .\chapter-8-1.py

のようにして実行してください。そうしないと、最後のprint関数の結果を確認するまえに、PowerShell(コマンドプロンプト)のウィンドウが閉じてしまいます。

コマンドをEnterキーで確定してそのまま放っておくと、PowerShellのウィンドウのタイトルが表示されます。しかし、表示前にアクティブなウィンドウを切り替えると上図のように結果が変わるので、何度か実行して試してください。

さて、このスクリプトですが、アクティブなウィンドウを取得しているのは

active_window = gw.getActiveWindow()

の部分です。ここまでの連載では、ウィンドウタイトルを指定して取得する、getWindowsWithTitle()を使用していましたが、今回は「アクティブなウィンドウ」を取得しています。アクティブなウィンドウは、常に1つだけ、なので[0]も必要ないところに注意してください。

そして、取得したアクティブなウィンドウを active_window 変数に保存しています。変数名が長くて面倒な場合は、a_win などお好みで短くしても大丈夫です。

ウィンドウのタイトルを取得するのは、active_window.title です。

インスタンス変数

少し難しい話になりますが、.(ドット、ピリオド)の後に続く変数はクラス変数またはインスタンス変数と言います。

前回のウィンドウのサイズやウィンドウの座標などはインスタンス変数となっています。今は、色々な変数・情報を分かりやすく整理するために設定されている、変数のテンプレートやフォーマットのようなものと考えておいてください。

PyAutoGUIで指定ウィンドウの中で画像検索

この.titleをprintしているので、ウィンドウのタイトルがPowerShell上に表示されたというわけです。さて、表示までに時間がかかるのは、time.sleep()関数のせいですが、これの位置を変えたらどうでしょうか?

active_window = gw.getActiveWindow()
time.sleep(1.5)
print(active_window.title)

このようにして実行して、ウィンドウタイトルが表示される前に、ウィンドウを切り替えてみてください。

それでも、printの結果は常に、PowerShellになってしまいます。

何故なら、active_window 変数には、Pythonが実行されたときにアクティブなウィンドウが保存されているので、そのウィンドウがアクティブでなくなったからといって、変数の中身は変わらないからです。

通常はあまり問題になりませんが、複雑な RPA やプログラムになってくると、変数に保存したタイミングが重要になる場合もあるので、覚えておいて下さいね。

 

メモ帳で名前をつけて保存する RPA をつくる

今作っていたPython ファイルは一旦閉じて、chapter-8-2.py などとして、新しい Python ファイルを作成します。「名前を付けて保存の確認」に対処するためには、まず名前をつけて保存をする Python スクリプトが必要なので、メモ帳で名前を付けて保存をする RPA を作成しましょう(ややこしいですね)。

import pyautogui as ag
import pygetwindow as gw
import time
import pyperclip as cb

memo = gw.getWindowsWithTitle('メモ帳')[0]
memo.activate()

ag.hotkey('ctrl', 'shift', 's')
time.sleep(0.3)
ag.press('backspace')
cb.copy('test.txt')
time.sleep(0.1)
ag.hotkey('ctrl', 'v')
time.sleep(0.3)
ag.press('enter')
time.sleep(0.5)
cb.copy('保存しました\n')
ag.hotkey('ctrl', 'v')

このような、メモ帳をアクティブにして「名前を付けて保存」をするだけの RPA を作成します。メモ帳は先に起動しておいてください。Pythonを実行すると、1度目は、