Pythonで処理を自動化する場合、PyAutoGUIが便利です。
今回は、PyAutoGUIによるキーボード操作を解説していきます。
誤解がないように先に記載しておきます。
キーボード操作の自動化が、この記事での対象です。
決して、キーボード入力の値を取得することではありません。
具体的には、input()関数の解説ではないということです。
あくまで、この記事で取り扱うのは、キーボード入力の自動操作となります。
業務効率化、RPAの分野における技術と言えます。
本記事の内容
- Pythonでキーボード操作を自動化するための環境
- PyAutoGUIで可能なキーボード操作
- write() 文字列を入力する
- press() キーボードを押す
- keyDown()・ keyUp() キーボードを下げる・上げる
- hotkey() ショートカット処理
- KEYBOARD_KEYS
それでは、上記に沿って解説していきます。
Pythonでキーボード操作を自動化するための環境
PyAutoGUIというキーワードが、先ほどから何度か出てきています。
このPyAutoGUIをPytonで利用できるようにする必要があります。
インストールに関しては、次の記事で解説しています。
インストールがまだの場合は、記事を参考にしてPyAutoGUIをインストールしてください。
プログラミングは、実際に試してナンボの技術です。
別に失敗したからと言って、基本的には何か被害が出るわけでもありません。
そのため、ドンドンと失敗を恐れずに試すべきです。
とにかく、手を動かすことがプログラミング習得の早道だと考えています。
話が逸れてしまいました。
PyAutoGUIを試すことができる環境が準備できたら、次へ進みましょう。
PyAutoGUIで可能なキーボード操作
PyAutoGUIで対応できるキーボード操作は、以下。
- 文字列を入力する
- キーボードを押す
- キーボードを下げる(押したまま)
- キーボードを上げる
- ショートカット処理
それぞれ、関数が用意されています。その関数は、以下。
- write()
- press()
- keyDown()
- keyUp()
- hotkey()
慣れていないと理解できない箇所があるかもしれません。
以下では、その箇所を中心に説明していきます。
なお、keyDown()とkeyUp()は2つで1つのようなモノです。
そのため、まとめて説明します。
write() 文字列を入力する
PyAutoGUIにおいて、メインとなる関数です。
ただし、日本語には対応していません。
そこが残念です。
でも、そこは割り切って利用しましょう。
そもそも、日本語を自動的に入力するケースなんてありますか?
そのようなケースがあるとしても、予め入力する日本語は決まっているわけです。
それであれば、辞書登録・コピペで対応できるはず。
辞書登録から選択、コピペもPyAutoGUIで対応できるでしょう。
つまり、日本語入力の実現方法はキーボード操作以外にもあるということです。
それらを組み合わせれば、日本語をキーボード操作で自動入力させる必要性もありません。
それでは、割り切って確認していきましょう。
以下は、「python keyword」と入力するキーボード操作の自動化を行うコードです。
(このコード以外のすべてコードで「import pyautogui」を省略)
import pyautogui pyautogui.write('python keyboard')
このPythonのプログラムを実行すると、キーボード操作が実行されます。
文字列が入力される場所は、マウスカーソルのある場所です。
これを言葉だけで説明するのは、やや困難です。
以下をご覧ください。

伝えたいことが、少しは伝わったかと思います。
マウスカーソルの位置を指定しないと、write()は使い物にならない可能性があります。
何も入力できない場所にマウスカーソルがあれば、何も入力できないことになります。
じゃあ、マウスカーソルをどうやって移動させるのか?となりますよね。
このことに関しては、次の記事で詳しく解説しています。
上記の記事内容が理解できれば、次のコードも理解できます。
プログラマーであれば、大体想像はできるでしょう。
#マウスの位置 pyautogui.move(-300, 0) pyautogui.click() pyautogui.write('python keyboard')
上記のコードを実行すると、以下のような動きとなります。

プログラム実行前は、Spyder(Pythonの記述されたエディタ)の方にマウスカーソルがあります。
プログラムが実行されると、そのマウスカーソルの位置から左へ300px移動します。
そして、その場所を自動的にクリックして、write()関数が実行という流れになります。
一度クリック処理を入れているのは、フォーカスを左のエディタに移動するためです。
あと、 write()関数には引数が一つあります。
interval
以下のようにして、設定します。
pyautogui.write('python keyboard', interval=0.25)
intervalの指定がないと、コピペしたような感じですよね。
intervalを指定することで、次のような動作となります。

簡単に言うと、ルパン三世のタイトル表示のような感じです。
少し古すぎたかもしれませんね。
まとめ
以上より、言えることは一つ。
「write()関数は、使いにくい!!」です。
慣れれば、使いやすくなるのかもしれませんけど。
なお、write()では1文字キーしか押せないので、例えばShiftキーやF1キーは押せません。
そりゃ、そうでしょうね。
やはり、キーボード操作を自動化して文字入力するのは違うのですよ。
文字入力は、文字入力で別の方法を模索すべきなのでしょう。
press() キーボードを押す
個人的には、このpress()関数を最もよく利用するだろうと思います。
設定可能なキーボードの値は、KEYBOARD_KEYS(記事最後)に載せています。
早速、コードを確認します。
pyautogui.press('enter')
このPythonプログラムを実行すると、「Enter」を押すだけの処理が実行されます。
正直、これだけではよくわかりません。
そこで、次のようなコードを用意しました。
先ほどのマウスカーソルを移動させて、文字列入力をするコードを改良しています。
pyautogui.move(-300, 0, 3) pyautogui.click() pyautogui.write('1') pyautogui.press('enter') pyautogui.write('2') pyautogui.press('enter') pyautogui.write('3') pyautogui.press('enter') pyautogui.write('4') pyautogui.press('enter') pyautogui.write('5') pyautogui.press('enter')
上記を実行した結果は以下。

write()関数で文字列入力した後、「Enter」を押して改行しています。
自動化処理っぽくなってきましたね。
あと、press()関数でもwrite()関数と同じことは可能です。
基本的には、press()関数では一文字の入力のみ可能となっています。
それを組み合わせれば、write()関数と同じことが実現できます。
次のコードでそのことを確認しましょう。
pyautogui.move(-300, 0) pyautogui.click() pyautogui.write('python keyboard') pyautogui.press('enter') pyautogui.press('enter') pyautogui.press('enter') pyautogui.press('p') pyautogui.press('y') pyautogui.press('t') pyautogui.press('h') pyautogui.press('o') pyautogui.press('n') pyautogui.press('space') pyautogui.press('k') pyautogui.press('e') pyautogui.press('y') pyautogui.press('b') pyautogui.press('o') pyautogui.press('a') pyautogui.press('r') pyautogui.press('d')
実行すると以下の結果となります。

write()関数により文字列「python keyboard」を入力します。
そして、「Enter」を3回押して改行します。
その後、各キーを押していくという流れです。
なお、次のコードでも同じ結果となります。
pyautogui.move(-300, 0) pyautogui.click() pyautogui.write('python keyboard') pyautogui.press('enter') pyautogui.press('enter') pyautogui.press('enter') pyautogui.press(['p', 'y', 't', 'h', 'o', 'n', 'space']) pyautogui.press(['k', 'e', 'y', 'b', 'o', 'a', 'r', 'd'])
リスト形式で入力文字を設定できるということですね。
あと、press関数では、以下の2つの引数を利用できます。
- presses
- interval
presses
何度、押すかという指定です。
pyautogui.press('enter', presses=3)
このように書けるということです。
そして、この引数pressesを設定している場合に、引数intervalを設定可能です。
先ほどのコードは、次のように書き換えることができます。
「Enter」を押す間隔は、わかりやすいように0.5秒としています。
pyautogui.move(-300, 0) pyautogui.click() pyautogui.write('python keyboard') pyautogui.press('enter', presses=3, interval=0.5) pyautogui.press(['p', 'y', 't', 'h', 'o', 'n', 'space']) pyautogui.press(['k', 'e', 'y', 'b', 'o', 'a', 'r', 'd'])
実行した結果は、以下。

まとめ
press()関数は、キーボードを押すことができます。
そして、押すことを繰り返して、文字入力も可能となります。
やはり、個人的にはwrite()関数よりもpress()関数を使うことになるでしょう。
keyDown()・ keyUp() キーボードを下げる・上げる
キーボードを下げる、この意味がわかりにくいかもしれません。
ずっと押したまま、ということです。
しかし、本当にずっと押したままということではないようです。
その証拠に以下のコードを実行してみてください。
pyautogui.move(-300, 0) pyautogui.click() pyautogui.keyDown('a')
結果は、以下。

「a」が永遠に入力されるわけでもありません。
キーボードを下げるの意味が、何となく(雰囲気でOK)わかったところでpress()との関係を説明します。
公式サイトでは、次のような説明されています。
(公式サイトは英語です)
つまり、数式で表現すると以下。
press() = keyDown() + keyUp()
押す(press)という処理は、下げる(keyDown)処理と上げる(keyUp)処理の組み合わせたモノということです。
よって、以下の2つのコードは、おなじ処理を実行することになります。
press()関数を利用する場合
pyautogui.press('a')
keyDown()関数とkeyUp()関数を利用する場合
pyautogui.keyDown('a') pyautogui.keyUp('a')
ここで、疑問に思いませんか?
「press()関数だけあれば、いいのではないか?」と。
一つのキーボードを押すという処理だけなら、 press()だけで十分です。
複数のキーボードを押すケースにおいては、keyDown()とkeyUp()が活躍します。
例えば、全選択でコピーする場合です。
全選択するために「Ctrl」を押しながら、「a」を押します。
これをPyAutoGUIを利用したコードで表現すると、以下となります。
pyautogui.move(-300, 0) pyautogui.click() pyautogui.keyDown('ctrl') pyautogui.press('a') pyautogui.keyUp('ctrl')
実行した結果は、以下。

これだけでは、特に意味のある処理ではありません。
ただ、自動コピペの第一歩となる処理にはなるでしょう。
hotkey() ショートカット処理
hotkey() を利用すれば、上記で説明した全選択のコピーを簡単に記述できます。
pyautogui.hotkey('ctrl', 'a')
内部の処理的には、以下のようになっているようです。
pyautogui.keyDown('ctrl') pyautogui.keyDown('a') pyautogui.keyUp('a') pyautogui.keyUp('ctrl')
3つの場合の方が、わかりやすいかもしれません。
pyautogui.hotkey('ctrl', 'shift', 'esc')
内部的には、以下のような処理が走ります。
pyautogui.keyDown('ctrl') pyautogui.keyDown('shift') pyautogui.keyDown('esc') pyautogui.keyUp('esc') pyautogui.keyUp('shift') pyautogui.keyUp('ctrl')
hotkey()関数を上手く使えば、コード量を減らすことができそうです。
KEYBOARD_KEYS
キーボード操作で押せるボタンは、以下の定数に設定されています。
print(pyautogui.KEYBOARD_KEYS)
これを表示すると、以下のようになります。