Python

最終更新日: 2023.06.05 (公開: 2023.06.05)

PythonのPyAutoGUIでPC操作を自動化!RPAの作成方法を解説

PythonのPyAutoGUIでPC操作を自動化!RPAの作成方法を解説

「PyAutoGUI」は、PythonでPC操作を自動化できるPythonライブラリです。私たちが手で行っているマウスやキーボードの操作を、あたかも人間が行っているように自動化できるため、反復操作や効率化のために活用されています。

このような自動化システムを「RPA」と呼び、ビジネスの分野でも注目され始めています。自動化というと「複雑」「難しそう」なイメージがあるかもしれませんが、PyAutoGUIを使えばシンプルなコードで、PC操作を簡単に自動化できるので便利です。

そこで本記事では、PythonのPyAutoGUIでPC操作を自動化する方法と応用テクニックを、サンプルコード付きで解説します。

「PyAutoGUI」とは

「PyAutoGUI」とは

「PyAutoGUI」とは、PythonでPCの操作を自動化するためのライブラリです。Windows・macOS・Linuxで使用できる、クロスプラットフォーム対応のライブラリとなっています。

PyAutoGUIの大きな魅力は、マウスやキーボードの操作を自動化できることです。これは、単にマウスカーソルの動きやクリックに関するものだけではありません。PyAutoGUIを使用することで、画面キャプチャやプログラムの実行・操作まで自動化できるようになります。言い換えれば、人間がPCで行うさまざまな作業を、PyAutoGUIで自動化できるということです。

コンピューターは無休で動作し続けることができるため、PyAutoGUIを使えば、24時間365日いつでも好きなタイミングで、何度でも同じ作業ができるということです。わずらわしいタスクをPCに任せるという、驚くほど便利なことが可能になります。

PyAutoGUIは「RPA」の一種

PyAutoGUIは「RPA」の一種です。RPA(Robotic Process Automation)とは、ロボットを活用した自動化システムを指します。

近年、さまざまな業界で業務効率の改善を図るために、ルーティンワークの自動化ができるRPAの導入が進んでいます。RPAを導入することで、ヒューマンエラーを解消することや人手不足の解消が可能です。PyAutoGUIは、RPAとして活用されるケースも増えています。

人間が行うPCの操作は、マウスの移動やクリックなど、同じ動作の繰り返しが少なくありません。そのため、PyAutoGUIを活用することで、ExcelやWebブラウザなどを自動的に操作できるようになります。なお、このようにPC操作を自動化するプログラムを「ロボット」と呼びます。

PyAutoGUIのインストール手順

PyAutoGUIのインストール手順

PyAutoGUIはPythonに標準的に備わっている機能ではないため、以下の手順でPyAutoGUIライブラリをインストールする必要があります。まずは、コマンドプロンプトを開き、以下のPIPコマンドを入力しましょう。

py -m pip install pyautogui
PIPcommand

PyAutoGUIのインストールが完了すると、以下のような画面が表示されます。なお、Pythonの環境によっては赤文字でエラー文が表示されることがありますが、最終的に「Successfully installed」と表示されていれば問題ありません。

Successfully installed

以上の手順で、PyAutoGUIを使ったプログラミングができるようになります。

【基礎編:マウスの操作】PyAutoGUIの基本的な使い方

【基礎編:マウスの操作】PyAutoGUIの基本的な使い方

PyAutoGUIの基本的なマウスの操作方法について、以下の5個のポイントから解説します。

  • マウスカーソル座標を取得する
  • マウスカーソルを絶対座標へ移動する
  • マウスカーソルを相対座標へ移動する
  • マウスをクリックする
  • マウスのドラッグを行う

マウスカーソル座標を取得する

PyAutoGUIによる自動化では、マウスカーソルをプログラムで動かすことが多いため、現在のマウス座標の取得が重要です。マウスカーソルの現在座標は、「pyautogui.position()」関数で取得できます。

pyautogui.position()

PyAutoGUIでマウスカーソル座標を取得する手順について、以下のサンプルコードで確認しましょう。

// サンプルプログラム

# coding: UTF-8

# 「pyautogui」ライブラリをimportする
import pyautogui

# main()関数|プログラムのエントリーポイント
if __name__ == "__main__":
  
  # マウスの現在座標を取得する
  pos = pyautogui.position()

  # マウス座標をコンソール画面に表示する
  print(pos)

// 実行結果

pyautoguiposition

マウス座標の表示状況がわかりやすいように、無限ループで上記の処理を回してみましょう。なお、無限ループはユーザーのキーボード入力で抜けるのが一般的ですが、そのためには「keyboard」モジュールが必要です。ただし、keyboardモジュールは標準搭載されていないため、以下のPIPコマンドでインストールする必要があります。

py -m pip install keyboard
keyboardmodule

keyboardモジュールのインストールが完了したら、以下のサンプルコードでマウスの現在座標を連続取得しましょう。

// サンプルプログラム

# coding: UTF-8

# 「pyautogui」ライブラリをimportする
import pyautogui

# 「keyboard」ライブラリをimportする
import keyboard

# 「time」ライブラリをimportする
import time

# 「sys」ライブラリをimportする
import sys

# main()関数|プログラムのエントリーポイント
if __name__ == "__main__":
  
  # 無限ループを回す
  while True:

    # マウスの現在座標を取得する
    pos = pyautogui.position()

    # マウス座標をコンソール画面に表示する
    print(pos)

    # 「Escape」キーが入力されたらプログラムを終了する
    if keyboard.is_pressed("Escape"):
      sys.exit()

    # 0.5秒間だけプロセスを停止する
    time.sleep(0.5)

// 実行結果

pyautogui.position

プログラムを終了したいときは、「Escape」キーを長押ししましょう。なお、「msvcrt」モジュールをインストールすれば、keyboard.is_pressed()の代わりにmsvcrt.kbhit()も使えます。keyboard.is_pressed()は特定のキー入力のみ受け付けますが、msvcrt.kbhit()はどのキーが押されても戻り値にTrueが返ります。

本プログラムではtimeモジュールの「sleep()関数」で、プログラムの進行を一時停止しています。これから解説するpyautogui.PAUSEの各関数では、「pause引数」で処理後の停止時間を指定することも可能です。ただし、環境によって正常に機能しないことがあるため、timeモジュールで別途指定するほうが確実です。

マウスカーソルを絶対座標へ移動する

マウスカーソルの移動は、RPAやPyAutoGUIによる自動化において、最も基本的なタスクです。PyAutoGUIでは、「pyautogui.moveTo()」関数で、マウスカーソルを目的の場所まで移動できます。

pyautogui.moveTo(X座標, Y座標, duration = 移動にかける秒数)

第1引数は移動目標のX座標、第2引数はY座標を指定します。pyautogui.moveTo()で指定するのは「絶対座標」で、スクリーンの左上部分が原点(0, 0)となり、右下に行くにしたがってX座標・Y座標ともに大きくなることがポイントです。

第3引数には、マウスカーソルの移動にかける時間を秒単位で指定します。この値を小さくすれば素早く、大きくすればゆっくりマウスカーソルが動きます。詳細は以下のサンプルコードのとおりです。

// サンプルプログラム

# coding: UTF-8

# 「pyautogui」ライブラリをimportする
import pyautogui

# main()関数|プログラムのエントリーポイント
if __name__ == "__main__":
  
  # 移動前のマウス座標をコンソール画面に表示する
  print(f"移動前:{pyautogui.position()}")

  # マウスカーソルを1秒かけて(300, 300)へ移動させる
  pyautogui.moveTo(300, 300, duration = 1)
  
  # 移動前のマウス座標をコンソール画面に表示する
  print(f"移動後:{pyautogui.position()}")

// 実行結果

pyautogui.moveTo

マウスカーソルの移動状況がわかりやすいように、ランダムな座標へ連続してマウスカーソルが移動するプログラムを作成してみましょう。

// サンプルプログラム

# coding: UTF-8

# 「pyautogui」ライブラリをimportする
import pyautogui

# 「keyboard」ライブラリをimportする
import keyboard

# 「random」ライブラリをimportする
import random

# 「sys」ライブラリをimportする
import sys

# main()関数|プログラムのエントリーポイント
if __name__ == "__main__":
  
  # スクリーンサイズを取得する
  width, height = pyautogui.size()

  # 無限ループを回す
  while True:

    # 移動前のマウス座標をコンソール画面に表示する
    print(f"移動前:{pyautogui.position()}")
    
    # マウスカーソルをランダムな座標へ移動させる
    # X座標・Y座標ともにスクリーンサイズに収まる範囲内
    # 移動時間は0.5秒~1.5秒の間に設定
    pyautogui.moveTo(random.randint(0, width), random.randint(0, height), duration = random.uniform(0.5, 1.5))
    
    # 移動後のマウス座標をコンソール画面に表示する
    print(f"移動後:{pyautogui.position()}\n")

    # 「Escape」キーが入力されたらプログラムを終了する
    if keyboard.is_pressed("Escape"):
      sys.exit()

// 実行結果

pyautogui.moveToresult

上記のサンプルプログラムを実行すると、マウスカーソルがランダムな座標へ、自動的に動き続けます。先ほどと同じように、「Escape」キーを長押しすると、プログラムが終了します。

なお、本プログラムでは最初に「pyautogui.size()」を呼び出し、スクリーンのサイズを取得しています。そのうえで、randomモジュールの関数でランダムな座標値と時間を生成し、マウスカーソルを移動させていることがポイントです。

マウスカーソルを相対座標へ移動する

前述したpyautogui.moveTo()は、スクリーンの左上部分を原点とする「絶対座標」で、マウスの移動先を指定します。しかし、現在のマウス座標を起点とした「相対座標」で、マウスをどこに移動させるか決めたいこともあるでしょう。そんなときは、「pyautogui.moveRel()」関数を使います。

pyautogui.moveRel(X座標, Y座標, duration = 移動にかける秒数)

絶対座標ではなく相対座標を指定する点以外は、pyautogui.moveTo()と同じように使います。なお、相対座標も絶対座標と同じく、左上方向はマイナス・右下方向はプラスに座標値が変化します。詳細を以下のサンプルコードで確認しましょう。

// サンプルプログラム

# coding: UTF-8

# 「pyautogui」ライブラリをimportする
import pyautogui

# main()関数|プログラムのエントリーポイント
if __name__ == "__main__":
  
  # 移動前のマウス座標をコンソール画面に表示する
  print(f"移動前:{pyautogui.position()}")
  
  # 現在地から(300, 300)離れた場所に、マウスカーソルを1秒かけて移動させる
  pyautogui.moveRel(300, 300, duration = 1)
  
  # 移動前のマウス座標をコンソール画面に表示する
  print(f"移動後:{pyautogui.position()}")

// 実行結果

pyautogui.moveRel

ランダムな場所に連続してマウスカーソルを移動させるプログラムを作成し、マウスカーソルの移動状況をわかりやすくしてみましょう。

// サンプルプログラム

# coding: UTF-8

# 「pyautogui」ライブラリをimportする
import pyautogui

# 「keyboard」ライブラリをimportする
import keyboard

# 「random」ライブラリをimportする
import random

# 「sys」ライブラリをimportする
import sys

# main()関数|プログラムのエントリーポイント
if __name__ == "__main__":
  
  # 相対座標の範囲を指定する
  width, height = 300, 300

  # 無限ループを回す
  while True:

    # 移動前のマウス座標をコンソール画面に表示する
    print(f"移動前:{pyautogui.position()}")
    
    # マウスカーソルをランダムな座標へ移動させる
    # X座標・Y座標ともに事前に指定した値の範囲内
    # 移動時間は0.5秒~1.5秒の間に設定
    pyautogui.moveRel(random.randint(-width, width), random.randint(-height, height), duration = random.uniform(0.5, 1.5))
    
    # 移動後のマウス座標をコンソール画面に表示する
    print(f"移動後:{pyautogui.position()}\n")

    # 「Escape」キーが入力されたらプログラムを終了する
    if keyboard.is_pressed("Escape"):
      sys.exit()

// 実行結果

randomresult

上記のサンプルプログラムを実行すると、マウスカーソルがランダムな座標に移動します。pyautogui.moveRel()は、マウスを「どれくらい」動かすべきかわかる場合におすすめです。一方、マウスを「どこに」動かすべきか指定したい場合は、スクリーン座標を指定できるpyautogui.moveTo()のほうがいいでしょう。

マウスをクリックする

コンピューターの作業の多くは「マウスのクリック」で行います。マウスクリックを自動化できれば、一気にRPAらしくなるでしょう。PyAutoGUIでは、「pyautogui.click()」関数でマウスのクリックを自動化できます。

pyautogui.click(X座標, Y座標, duration = 移動にかける秒数)

引数自体は前述したpyautogui.moveTo()と同じですが、pyautogui.click()はマウスカーソルを移動したあとにクリックが行われることがポイントです。pyautogui.click()によるマウスクリックの自動化について、以下のサンプルコードで検証を行ってみましょう。

なお、本プログラムでは検証用のための簡易的なGUIアプリを、「Tkinter」というGUIライブラリで作成しています。program()関数にその部分の記載がありますが、今回のPyAutoGUIとは直接関係がないため、その中身を理解する必要はありません。

// サンプルプログラム

# coding: UTF-8

# 「pyautogui」ライブラリをimportする
import pyautogui

# 「threading」ライブラリをimportする
import threading

# ボタンの位置を設定する
# 初期設定ではスクリーンの中央
# この部分をさまざまな値に変更してみよう
pos_x = pyautogui.size()[0] / 2
pos_y = pyautogui.size()[1] / 2

# program()関数|検証用のGUIアプリを起動する
# この関数の内容については無視してOK
def program():

  # 「tkinter」ライブラリをimportする
  import tkinter
  
  # tkinterの「messagebox」オブジェクトをimportする
  from tkinter import messagebox

  # clicked()関数|ボタンクリック時の動作を定義する
  def clicked():
    messagebox.showinfo("成功!", "ボタンの自動クリックに成功しました!")

  # Tkinterのメインウィンドウを最大化して表示する
  root = tkinter.Tk()
  root.state("zoomed")

  # 画面中央に大きなボタンを配置する
  tkinter.Button(root, text = "ボタン", font=("", 50), command = clicked).place(x = pos_x, y = pos_y, anchor = tkinter.CENTER)
  
  # Tkinterのイベント処理を実行する
  root.mainloop()

# main()関数|プログラムのエントリーポイント
if __name__ == "__main__":

  # 別スレッドで「program()」関数を実行する
  # この部分の内容については無視してOK
  thread = threading.Thread(target = program)
  thread.start()

  # マウスカーソルを1秒間かけてボタンの位置に移動してクリックする
  pyautogui.click(pos_x, pos_y, duration = 1)
  
  # Tkinter用のスレッドが終了するのを待つ
  # この部分の内容については無視してOK
  thread.join()

// 実行結果

初期状態
button
自動クリック時
auto-click

上記のサンプルプログラムを実行すると、中央に1つのボタンがあるGUIアプリがスクリーン全体に表示されます。ボタンをクリックすると、ポップアップウィンドウが表示される仕様です。

本プログラムは、マウスカーソルがボタンに向かって自動的に動いてクリックされるので、起動から約1秒でポップアップウィンドウが表示されます。

また「pos_x」と「pos_y」の値を変更すると、ボタンの表示位置が変わります。さまざまなパターンを試して、自動クリックの動作をお楽しみください。

マウスのドラッグを行う

マウスのドラッグは、オブジェクトの選択や移動を行うために重要な操作です。PyAutoGUIでは、pyautogui.dragTo()とpyautogui.dragRel()の2つの関数で、マウスの自動ドラッグを実現できます。

pyautogui.dragTo(X座標, Y座標, duration = 移動にかける秒数, button = 押すボタン)
pyautogui.dragRel(X座標, Y座標, duration = 移動にかける秒数, button = 押すボタン)

2つの関数の関係は、マウスカーソルを移動させるための関数である、pyautogui.moveTo()とpyautogui.moveRel()のペアと同じです。つまり、pyautogui.dragTo()が絶対座標・pyautogui.dragRel()が相対座標を指定するものです。

「button引数」には、「”left”」もしくは「”right”」でドラッグ時に押すボタンを指定します。マウスのドラッグを自動化する方法について、以下のサンプルコードで確認しましょう。

// サンプルプログラム

# coding: UTF-8

# 「pyautogui」ライブラリをimportする
import pyautogui

# 「threading」ライブラリをimportする
import threading

# 「time」ライブラリをimportする
import time

# program()関数|検証用のGUIアプリを起動する
# この関数の内容については無視してOK
def program():

  # 「tkinter」ライブラリをimportする
  import tkinter
  
  # Tkinterのメインウィンドウを最大化して表示する
  root = tkinter.Tk()
  root.state("zoomed")

  # テキストボックスを配置する
  tkinter.Text(root, font=("", 30)).pack(expand = True, fill = tkinter.BOTH)
  
  # Tkinterのイベント処理を実行する
  root.mainloop()

# main()関数|プログラムのエントリーポイント
if __name__ == "__main__":

  # 別スレッドで「program()」関数を実行する
  # この部分の内容については無視してOK
  thread = threading.Thread(target = program)
  thread.start()
  
  # 画面の中央部分でマウスをクリックする
  pos_x, pos_y = pyautogui.size()
  pyautogui.click(x = pos_x / 2, y = pos_y / 2, duration = 0.5)
  
  # 「Hello, World!」という文字列を0.1秒間隔で1文字ずつ入力する
  pyautogui.typewrite("Hello, World!\n", interval = 0.1)
  
  # 0.5秒待機する
  time.sleep(0.5)

  # 絶対座標(10, 10)に向けて、左ボタンを押しながらドラッグする
  pyautogui.dragTo(10, 10, duration = 1, button = "left")
    
  # 「Ctrl」と「c」を同時押しする
  # これは「コピー」のショートカットキー
  # 2つ目のキーを大文字にしないように注意
  pyautogui.hotkey("Ctrl", "c")
  
  # 選択した部分に上書きしないように、もう一度画面の中央をクリックする
  pyautogui.click(x = pos_x / 2, y = pos_y / 2, duration = 0.25)
  
  for i in range(5):
    # 「Ctrl」と「v」を同時押しする
    # これは「ペースト」のショートカットキー
    # 2つ目のキーを大文字にしないように注意
    pyautogui.hotkey("Ctrl", "v")
  
    # 0.25秒待機する
    time.sleep(0.25)

  # Tkinter用のスレッドが終了するのを待つ
  # この部分の内容については無視してOK
  thread.join()

// 実行結果

ドラッグ時
drag
貼り付け時
paste

上記のサンプルプログラムは、コピーペーストを行うときに、「Ctrl+a」ではなくマウスドラッグで選択していることがポイントです。なお、今回はpyautogui.dragTo()のみ使用しましたが、現在のマウス座標を起点としてドラッグしたいときは、pyautogui.dragRel()を選ぶといいでしょう。

【基礎編:キーボードの操作】PyAutoGUIの基本的な使い方

【基礎編:キーボードの操作】PyAutoGUIの基本的な使い方

PyAutoGUIの基本的なキーボードの操作方法について、以下の5個のポイントから解説します。

  • 指定した文字列を入力する
  • キーボードのキーを1つ押す
  • キーボードの複数キーを順番に押す
  • キーボードの複数キーを同時押しする
  • キーボードのキーを押す・離す動作を行う

指定した文字列を入力する

文字列の入力も、RPAで自動化されることが多いタスクです。PyAutoGUIでは、「pyautogui.write()」関数を利用することで、文字列入力の自動化を実現可能です。

pyautogui.write(文字列)

引数に文字列を指定するだけで、プログラムに文字列を入力できます。ただし、有効なテキストフィールドが選択されている状態でなければ、文字列の入力が反映されないので注意が必要です。pyautogui.write()関数を使った文字列入力の自動化について、以下のサンプルコードで検証してみましょう。なお、今回も検証用のGUIプログラムを作成していますが、program()関数の中身を理解する必要はありません。

// サンプルプログラム

# coding: UTF-8

# 「pyautogui」ライブラリをimportする
import pyautogui

# 「threading」ライブラリをimportする
import threading

# program()関数|検証用のGUIアプリを起動する
# この関数の内容については無視してOK
def program():

  # 「tkinter」ライブラリをimportする
  import tkinter
  
  # Tkinterのメインウィンドウを最大化して表示する
  root = tkinter.Tk()
  root.state("zoomed")

  # テキストボックスを配置する
  tkinter.Text(root, font=("", 30)).pack(expand = True, fill = tkinter.BOTH)
  
  # Tkinterのイベント処理を実行する
  root.mainloop()

# main()関数|プログラムのエントリーポイント
if __name__ == "__main__":

  # 別スレッドで「program()」関数を実行する
  # この部分の内容については無視してOK
  thread = threading.Thread(target = program)
  thread.start()
  
  # 画面の中央部分でマウスをクリックする
  pos_x, pos_y = pyautogui.size()
  pyautogui.click(x = pos_x / 2, y = pos_y / 2, duration = 1)
  
  # 「Hello World!」というテキストを入力する
  pyautogui.write("Hello World!")
  
  # Tkinter用のスレッドが終了するのを待つ
  # この部分の内容については無視してOK
  thread.join()

// 実行結果

初期状態
initial
自動入力時
autofill

重要なポイントは、まずGUIプログラムのテキストフィールドをクリックしてから、pyautogui.write()関数で文字列を入力していることです。このようにするとGUIプログラムのテキストフィールドを有効化してから、文字列を自動入力できます。このクリック動作を挟まなければ、自動入力が反映されないので注意してください。

また、「pyautogui.write(“こんにちは!”)」のように、日本語を指定しても何も表示されません。これは、pyautoguiのライブラリが基本的に日本語入力に対応していないからです。しかし、ほかのライブラリと組み合わせることでpyautoguiでも日本語入力ができるので、詳細は後述します。

キーボードのキーを1つ押す

先ほどは文字列を一気に自動入力しましたが、1つのキーだけ入力させたいときもあります。そんなときは、「pyautogui.press()」関数を使いましょう。

pyautogui.press(キーを示す文字列)

「キーを示す文字列」として、基本的にはアルファベットや数字をそのまま入力します。しかし、以下のようなキーはアルファベットや数字で表現できないので、以下のように文字列で指定します。

キーの種類 文字列
Enter “Enter”
“\n”
Esc “Esc”
Shift “Shiftleft”
“Shiftright”
Alt “Altleft”
“Altright”
Ctrl “Ctrlleft”
“Ctrlright”
Tab “Tab”
“\t”
Backspace “Backspace”
Delete “Delete”
PageUp “Pageup”
PageDown “Pagedown”
Home “Home”
End “End”
PrintScreen “Printscreen”
CapsLock “Capslock”
NumLock “Numlock”
Insert “Insert”
Windowsキー “Win”
“Winleft”
“Winright”
矢印キー “Up”
“Down”
“Left”
“Right”
ファンクションキー “F1”
“F2”
“F3”
など

以上の内容を踏まえて、pyautogui.press()関数の使い方について、以下のサンプルコードで確認しましょう。

// サンプルプログラム

# coding: UTF-8

# 「pyautogui」ライブラリをimportする
import pyautogui

# 「threading」ライブラリをimportする
import threading

# 「time」ライブラリをimportする
import time

# program()関数|検証用のGUIアプリを起動する
# この関数の内容については無視してOK
def program():

  # 「tkinter」ライブラリをimportする
  import tkinter
  
  # Tkinterのメインウィンドウを最大化して表示する
  root = tkinter.Tk()
  root.state("zoomed")

  # テキストボックスを配置する
  tkinter.Text(root, font=("", 30)).pack(expand = True, fill = tkinter.BOTH)
  
  # Tkinterのイベント処理を実行する
  root.mainloop()

# main()関数|プログラムのエントリーポイント
if __name__ == "__main__":

  # 別スレッドで「program()」関数を実行する
  # この部分の内容については無視してOK
  thread = threading.Thread(target = program)
  thread.start()
  
  # 画面の中央部分でマウスをクリックする
  pos_x, pos_y = pyautogui.size()
  pyautogui.click(x = pos_x / 2, y = pos_y / 2, duration = 1)
  
  # 「A→Enter→x」と入力したあとに、2文字消して「B」を入力し直す
  # というシナリオでキー入力操作を自動化する
  pyautogui.press("A")
  time.sleep(0.5)
  pyautogui.press("Enter")
  time.sleep(0.5)
  pyautogui.press("x")
  time.sleep(0.25)
  pyautogui.press("Backspace")
  time.sleep(0.25)
  pyautogui.press("Backspace")
  time.sleep(0.5)
  pyautogui.press("B")
  
  # Tkinter用のスレッドが終了するのを待つ
  # この部分の内容については無視してOK
  thread.join()

// 実行結果

入力途中
inthemiddle
入力完了
completion

上記のサンプルプログラムのように、pyautogui.press()関数を使うときは、細かくtime.sleep()関数を挟むことが重要です。単にpyautogui.press()を並べるだけでは、プログラムの進行にキーボード入力が追い付かず、正常に動作しない可能性があります。

キーボードの複数キーを順番に押す

入力する文字列をあらかじめ指定したうえで、一定間隔で1文字ずつ自動入力させたい場合は、「pyautogui.typewrite()」関数を使用しましょう。

pyautogui.typewrite("Hello, World!", interval = 0.5)

前述したように、指定できる文字列は日本語のようなマルチバイト文字ではない、シングルバイトの英数字のみです。pyautogui.typewrite()の使い方について、以下のサンプルコードで確認しましょう。

// サンプルプログラム

# coding: UTF-8

# 「pyautogui」ライブラリをimportする
import pyautogui

# 「threading」ライブラリをimportする
import threading

# program()関数|検証用のGUIアプリを起動する
# この関数の内容については無視してOK
def program():

  # 「tkinter」ライブラリをimportする
  import tkinter
  
  # Tkinterのメインウィンドウを最大化して表示する
  root = tkinter.Tk()
  root.state("zoomed")

  # テキストボックスを配置する
  tkinter.Text(root, font=("", 30)).pack(expand = True, fill = tkinter.BOTH)
  
  # Tkinterのイベント処理を実行する
  root.mainloop()

# main()関数|プログラムのエントリーポイント
if __name__ == "__main__":

  # 別スレッドで「program()」関数を実行する
  # この部分の内容については無視してOK
  thread = threading.Thread(target = program)
  thread.start()
  
  # 画面の中央部分でマウスをクリックする
  pos_x, pos_y = pyautogui.size()
  pyautogui.click(x = pos_x / 2, y = pos_y / 2, duration = 1)
  
  # 「Hello, World!」という文字列を0.5秒間隔で1文字ずつ入力する
  pyautogui.typewrite("Hello, World!", interval = 0.5)
  
  # Tkinter用のスレッドが終了するのを待つ
  # この部分の内容については無視してOK
  thread.join()

// 実行結果

入力途中
inthemiddle
入力完了
completion

本プログラムを実行すると、まるでアニメーションのように、1文字ずつ自動的に入力されていきます。通常の文字列を入力するケースでは、前述したpyautogui.press()で1文字ずつ指定するのは面倒なので、pyautogui.typewrite()を選ぶほうがいいでしょう。

上記のように、文字列をひとまとまりで指定する場合、DeleteキーやWindowsキーなど「英数字1文字で指定できないキー」は、pyautogui.typewrite()では入力できません。しかし、次のようにリスト形式で1文字ずつ指定すると、特殊キーも指定することが可能です。

// サンプルプログラム

# coding: UTF-8

# 「pyautogui」ライブラリをimportする
import pyautogui

# 「threading」ライブラリをimportする
import threading

# program()関数|検証用のGUIアプリを起動する
# この関数の内容については無視してOK
def program():

  # 「tkinter」ライブラリをimportする
  import tkinter
  
  # Tkinterのメインウィンドウを最大化して表示する
  root = tkinter.Tk()
  root.state("zoomed")

  # テキストボックスを配置する
  tkinter.Text(root, font=("", 30)).pack(expand = True, fill = tkinter.BOTH)
  
  # Tkinterのイベント処理を実行する
  root.mainloop()

# main()関数|プログラムのエントリーポイント
if __name__ == "__main__":

  # 別スレッドで「program()」関数を実行する
  # この部分の内容については無視してOK
  thread = threading.Thread(target = program)
  thread.start()
  
  # 画面の中央部分でマウスをクリックする
  pos_x, pos_y = pyautogui.size()
  pyautogui.click(x = pos_x / 2, y = pos_y / 2, duration = 0.5)
  
  # 「Hello」「Enter」「World!」という文字列を0.1秒間隔で1文字ずつ入力する
  # リスト形式の場合は、1キーずつ指定する必要があるので注意
  pyautogui.typewrite(["H", "e", "l", "l", "o", "Enter", "W", "o", "r", "l", "d", "!"], interval = 0.1)
  
  # Tkinter用のスレッドが終了するのを待つ
  # この部分の内容については無視してOK
  thread.join()

// 実行結果

入力途中
inthemiddle
入力完了
completion

このように、Enterキーもpyautogui.typewrite()で自動入力できていますが、リスト形式で1文字ずつ指定するのは面倒です。そのため、基本的には文字列形式でまとめて指定し、特殊キーだけpyautogui.press()にするなど、状況に応じて使い分けるのがおすすめです。

キーボードの複数キーを同時押しする

複数のキーを自動的に同時押しさせたい場合は、「pyautogui.hotkey()」関数を使用しましょう。

pyautogui.hotkey(1つ目のキー, 2つ目のキー, ...)

pyautogui.hotkey()には、2つ以上のキーを指定できます。まずは、通常の英数字キーを同時押しさせる方法について、以下のサンプルコードで確認しましょう。

// サンプルプログラム

# coding: UTF-8

# 「pyautogui」ライブラリをimportする
import pyautogui

# 「threading」ライブラリをimportする
import threading

# program()関数|検証用のGUIアプリを起動する
# この関数の内容については無視してOK
def program():

  # 「tkinter」ライブラリをimportする
  import tkinter
  
  # Tkinterのメインウィンドウを最大化して表示する
  root = tkinter.Tk()
  root.state("zoomed")

  # テキストボックスを配置する
  tkinter.Text(root, font=("", 30)).pack(expand = True, fill = tkinter.BOTH)
  
  # Tkinterのイベント処理を実行する
  root.mainloop()

# main()関数|プログラムのエントリーポイント
if __name__ == "__main__":

  # 別スレッドで「program()」関数を実行する
  # この部分の内容については無視してOK
  thread = threading.Thread(target = program)
  thread.start()
  
  # 画面の中央部分でマウスをクリックする
  pos_x, pos_y = pyautogui.size()
  pyautogui.click(x = pos_x / 2, y = pos_y / 2, duration = 1)
  
  # 「X」「Y」「Z」を同時押しする
  pyautogui.hotkey("X", "Y", "Z")
  
  # Tkinter用のスレッドが終了するのを待つ
  # この部分の内容については無視してOK
  thread.join()

// 実行結果

pyautogui.hotkey

上記のサンプルプログラムでは、「X」「Y」「Z」の3つのキーを同時に押させています。同時に押させるとはいえ、基本的には関数の引数に指定した順番で押されることになります。このpyautogui.hotkey()には、「Ctrl」や「Alt」などの特殊キーも指定可能です。つまり、コピーやペーストなどの「ショートカットキー」の入力も、pyautogui.hotkey()で自動化できるということです。

// サンプルプログラム

# coding: UTF-8

# 「pyautogui」ライブラリをimportする
import pyautogui

# 「threading」ライブラリをimportする
import threading

# 「time」ライブラリをimportする
import time

# program()関数|検証用のGUIアプリを起動する
# この関数の内容については無視してOK
def program():

  # 「tkinter」ライブラリをimportする
  import tkinter
  
  # Tkinterのメインウィンドウを最大化して表示する
  root = tkinter.Tk()
  root.state("zoomed")

  # テキストボックスを配置する
  tkinter.Text(root, font=("", 30)).pack(expand = True, fill = tkinter.BOTH)
  
  # Tkinterのイベント処理を実行する
  root.mainloop()

# main()関数|プログラムのエントリーポイント
if __name__ == "__main__":

  # 別スレッドで「program()」関数を実行する
  # この部分の内容については無視してOK
  thread = threading.Thread(target = program)
  thread.start()
  
  # 画面の中央部分でマウスをクリックする
  pos_x, pos_y = pyautogui.size()
  pyautogui.click(x = pos_x / 2, y = pos_y / 2, duration = 0.5)
  
  # 「Hello, World!」という文字列を0.1秒間隔で1文字ずつ入力する
  pyautogui.typewrite("Hello, World!", interval = 0.1)
  
  # 0.5秒待機する
  time.sleep(0.5)
  
  # 「Ctrl」と「a」を同時押しする
  # これは「全選択」のショートカットキー
  # 2つ目のキーを大文字にしないように注意
  pyautogui.hotkey("Ctrl", "a")
  
  # 0.5秒待機する
  time.sleep(0.5)
  
  # 「Ctrl」と「c」を同時押しする
  # これは「コピー」のショートカットキー
  # 2つ目のキーを大文字にしないように注意
  pyautogui.hotkey("Ctrl", "c")
  
  # 選択した部分に上書きしないように、もう一度画面の中央をクリックする
  pyautogui.click(x = pos_x / 2, y = pos_y / 2, duration = 0.25)
  
  # 改行してから0.1秒待機する
  pyautogui.press("Enter")
  time.sleep(0.1)
  
  for i in range(5):
    # 「Ctrl」と「v」を同時押しする
    # これは「ペースト」のショートカットキー
    # 2つ目のキーを大文字にしないように注意
    pyautogui.hotkey("Ctrl", "v")
  
    # 0.25秒待機する
    time.sleep(0.25)
  
  # 「Ctrl」と「a」を同時押しする
  # これは「全選択」のショートカットキー
  # 2つ目のキーを大文字にしないように注意
  pyautogui.hotkey("Ctrl", "a")
  
  # 0.5秒待機する
  time.sleep(0.5)
  
  # 「Ctrl」と「x」を同時押しする
  # これは「切り取り」のショートカットキー
  # 2つ目のキーを大文字にしないように注意
  pyautogui.hotkey("Ctrl", "x")

  # Tkinter用のスレッドが終了するのを待つ
  # この部分の内容については無視してOK
  thread.join()

// 実行結果

コピー後
copy
ペースト後
paste
切り取り後
cut

上記のサンプルプログラムでは、まず「Hello, World!」という文章を入力したあとに、「全選択」→「コピー」→「ペースト」→「切り取り」を行う作業を自動化しています。

RPAによる自動化を行う際は、「私たちがどのように操作しているか」を考え、それをソースコードに落とし込むことが重要です。たとえば、全選択後にコピーしたあとは、貼り付ける前に選択を解除しないといけません。

本プログラムでは、マウスクリックで選択を解除したあとに5回貼り付けることで、「Hello, World!」が6回正しく表示されます。各操作後に「time.sleep()」を挟み、キーボード入力操作の間隔を設けていることもポイントです。

なお、ショートカットキーの入力を自動化するとき、pyautogui.hotkey()の第2引数は大文字ではなく必ず小文字を指定します。大文字を指定すると、ショートカットキーが働かないので注意が必要です。

キーボードのキーを押す・離す動作を行う

キーボードを押したままの状態にする場合は「pyautogui.keyDown()」関数を、離した状態にする場合は「pyautogui.keyUp()」関数を使います。

pyautogui.keyDown(キーを示す文字列)
pyautogui.keyUp(キーを示す文字列)

これらの関数は、必ずセットで使用することが重要です。たとえば、pyautogui.keyDown()で「Ctrl」を押しっぱなしの状態にしてプログラムを終了すると、その後も「Ctrl」が押された状態になっているため、キーボードやマウスの動作がおかしくなります。詳細を以下のサンプルコードで確認しましょう。

// サンプルプログラム

# coding: UTF-8

# 「pyautogui」ライブラリをimportする
import pyautogui

# 「threading」ライブラリをimportする
import threading

# 「time」ライブラリをimportする
import time

# program()関数|検証用のGUIアプリを起動する
# この関数の内容については無視してOK
def program():

  # 「tkinter」ライブラリをimportする
  import tkinter
  
  # Tkinterのメインウィンドウを最大化して表示する
  root = tkinter.Tk()
  root.state("zoomed")

  # テキストボックスを配置する
  tkinter.Text(root, font=("", 30)).pack(expand = True, fill = tkinter.BOTH)
  
  # Tkinterのイベント処理を実行する
  root.mainloop()

# main()関数|プログラムのエントリーポイント
if __name__ == "__main__":

  # 別スレッドで「program()」関数を実行する
  # この部分の内容については無視してOK
  thread = threading.Thread(target = program)
  thread.start()
  
  # 画面の中央部分でマウスをクリックする
  pos_x, pos_y = pyautogui.size()
  pyautogui.click(x = pos_x / 2, y = pos_y / 2, duration = 0.5)
  
  # 「Hello, World!」という文字列を0.1秒間隔で1文字ずつ入力する
  pyautogui.typewrite("Hello, World!", interval = 0.1)
  
  # 0.5秒待機する
  time.sleep(0.5)
  
  # 「Ctrl」を押したままの状態にする
  # 「a」を押したままの状態にする
  # これは「全選択」のショートカットキー
  pyautogui.keyDown("Ctrl")
  pyautogui.keyDown("a")
  
  # 0.1秒待機する
  time.sleep(0.1)
  
  # 「Ctrl」を離した状態にする
  # 「a」を離したの状態にする
  # これは「全選択」のショートカットキー
  pyautogui.keyUp("Ctrl")
  pyautogui.keyUp("a")

  # Tkinter用のスレッドが終了するのを待つ
  # この部分の内容については無視してOK
  thread.join()

// 実行結果

入力完了後
completion
全選択後
selectall

上記のサンプルプログラムは、「Ctrl + a」によるテキストフィールドの全選択工程を、pyautogui.keyDown()で自動化しています。重要なポイントは、プログラム終了前にpyautogui.keyUp()で離した状態にしていることです。

これを行わないと、マウスクリックができなくなったり、マウスホイールを回したときに画面の拡大縮小が行われたりします。pyautogui.keyDown()で押したキーは、プログラム終了前に必ずpyautogui.keyUp()で離した状態に戻しましょう。

なお、pyautogui.keyDown()とpyautogui.keyUp()は、前述した「pyautogui.hotkey()」で同じことが行えるためほとんど使いません。

【応用編】PyAutoGUIで高度な自動化を行うためのテクニック

【応用編】PyAutoGUIで高度な自動化を行うためのテクニック

先ほど解説した関数・メソッドに加えて、以下のようなテクニックを身につけることで、PyAutoGUIでより高度な自動化ができるようになります。

  • ページをスクロールする
  • CSVファイルの内容を転記する

ページをスクロールする

PyAutoGUIでWebページをスクロールするためには、以下の構文で「pyautogui.scroll()」関数を使用しましょう。

pyautogui.scroll(スクロール単位)

引数にはスクロール単位を指定しますが、ページを下方向にスクロールする場合は「負の値」で、上方向の場合は「正の値」となります。なお、値の大きさは対象のアプリやウィンドウのサイズによって異なるため、さまざまなパターンを試行錯誤してみましょう。一般的には100~1,000前後の値でいいでしょう。

// サンプルプログラム

# coding: UTF-8

# 「pyautogui」ライブラリをimportする
import pyautogui

# 「threading」ライブラリをimportする
import threading

# 「time」ライブラリをimportする
import time

# program()関数|検証用のGUIアプリを起動する
# この関数の内容については無視してOK
def program():

  # 「tkinter」ライブラリをimportする
  import tkinter
  
  # Tkinterのメインウィンドウを最大化して表示する
  root = tkinter.Tk()
  root.state("zoomed")

  # リストボックス用のデータを生成する
  data = []
  for i in range(100):
    data.append(f"データ{str(i + 1)}")

  # リストボックスのウィジェットを生成する
  listbox = tkinter.Listbox(root, listvariable = tkinter.StringVar(value = data), font = ("", 50))
  
  # スクロールバーを生成する
  scrollbar = tkinter.Scrollbar(root, orient = tkinter.VERTICAL, command = listbox.yview)

  # スクロールバーをリストボックスに反映させる
  listbox["yscrollcommand"] = scrollbar.set

  # 各ウィジェットを配置する
  listbox.pack(expand = True, fill = tkinter.BOTH)
  scrollbar.pack(anchor = tkinter.E)

  # Tkinterのイベント処理を実行する
  root.mainloop()

# main()関数|プログラムのエントリーポイント
if __name__ == "__main__":

  # 別スレッドで「program()」関数を実行する
  # この部分の内容については無視してOK
  thread = threading.Thread(target = program)
  thread.start()
  
  # 画面の中央部分にマウスを移動させる
  pos_x, pos_y = pyautogui.size()
  pyautogui.moveTo(x = pos_x / 2, y = pos_y / 2, duration = 1)
  time.sleep(0.5)

  # 下方向へのスクロールを5回繰り返す
  for i in range(5):
    pyautogui.scroll(-300)
    time.sleep(0.25)

  # 上方向へのスクロールを3回繰り返す
  for i in range(3):
    pyautogui.scroll(300)
    time.sleep(0.25)
  
  # Tkinter用のスレッドが終了するのを待つ
  # この部分の内容については無視してOK
  thread.join()

// 実行結果

初期状態
initial
下方向へのスクロール後
scroll-bottom
上方向へのスクロール後
scroll-top

上記のサンプルプログラムを実行すると、自動的に画面がスクロールされます。yautogui.scroll()の引数を変えるとスクロール量も変わるので、さまざまな値を試してみましょう。

CSVファイルの内容を転記する

CSVファイルは、コンマで値が区切られたテキストファイルのことです。実務においては、CSVファイルのデータをテキストエディタなどに転記するシーンは、意外にも多く見られます。しかし、手作業で転記するのは効率的ではないため、RPAによる自動化が進められています。

PyAutoGUIでは、pyautogui.click()やpyautogui.typewrite()などの関数を活用することで、CSVファイルの転記を自動化することが可能です。まずは、以下のようなCSVファイルを「Sample.csv」という名称で作成して、サンプルコードを実行してみてください。

// Sample.csv

Data1,Element1,Value1
Data2,Element2,Value2
Data3,Element3,Value3
Data4,Element4,Value4
Data5,Element5,Value5

// サンプルプログラム

# coding: UTF-8

# 「pyautogui」ライブラリをimportする
import pyautogui

# 「threading」ライブラリをimportする
import threading

# 「CSV」ライブラリをimportする
import csv

# program()関数|検証用のGUIアプリを起動する
# この関数の内容については無視してOK
def program():

  # 「tkinter」ライブラリをimportする
  import tkinter
  
  # Tkinterのメインウィンドウを最大化して表示する
  root = tkinter.Tk()
  root.state("zoomed")

  # テキストボックスを配置する
  tkinter.Text(root, font=("", 30)).pack(expand = True, fill = tkinter.BOTH)
  
  # Tkinterのイベント処理を実行する
  root.mainloop()

# main()関数|プログラムのエントリーポイント
if __name__ == "__main__":

  # 別スレッドで「program()」関数を実行する
  # この部分の内容については無視してOK
  thread = threading.Thread(target = program)
  thread.start()
  
  # テキストフィールドに入力するために、画面の中央部分でマウスをクリックする
  pos_x, pos_y = pyautogui.size()
  pyautogui.click(x = pos_x / 2, y = pos_y / 2, duration = 0.5)

  # CSVファイルを開く
  with open("Sample.csv", encoding = "UTF-8") as f:

    # CSVのリーダーを生成する
    reader = csv.reader(f)

    # データの行と列を順番に走査していく
    for row in reader:
      for i, column in enumerate(row):

        # 各項目を0.05秒間隔で1文字ずつ入力する
        pyautogui.typewrite(column, interval = 0.05)

        # その行の最後のデータ以外はカンマを挿入する
        if i < len(row) - 1:
          pyautogui.write(", ")

      # 行ごとに改行する
      pyautogui.press("Enter")

  # Tkinter用のスレッドが終了するのを待つ
  # この部分の内容については無視してOK
  thread.join()

// 実行結果

データ入力中
typing
転記の完了時
completion

上記のサンプルプログラムでは、PythonのCSVライブラリを使用して、CSVファイルのデータを取得しています。そのうえで、各行のデータを1文字ずつ入力していることがポイントです。

【実践編】さまざまなプログラムの操作を自動化する方法

【実践編】さまざまなプログラムの操作を自動化する方法

これまでに解説したテクニックを応用することで、以下のようにさまざまなプログラムの操作を自動化できるようになります。

  • 「メモ帳」を操作する
  • 「Google Chrome」でWebサイトを検索する
  • 「ペイント」で図形を描画する

「メモ帳」を操作する

「メモ帳」は、Windows PCで最も操作することが多い、簡易的なテキストエディタです。メモ帳のアプリを開くところから入力・保存までの作業は、以下のようなソースコードで自動化できます。

// サンプルプログラム

# coding: UTF-8

# 「pyautogui」ライブラリをimportする
import pyautogui

# 「time」ライブラリをimportする
import time

# main()関数|プログラムのエントリーポイント
if __name__ == "__main__":

  # 自動入力のインターバル時間を設定する
  interval = 1

  # 保存先ファイル名を指定する
  filename = "Auto.txt"
  
  # 「Win」と「r」の同時押しで「ファイル名を指定して実行」を開く
  pyautogui.hotkey("Win", "r")
  time.sleep(interval)

  # 「メモ帳」アプリを開く
  # すでに文字列が入力されている可能性があるため、削除してから入力する
  pyautogui.press("Delete")
  pyautogui.write("Notepad")
  time.sleep(interval)

  # 「Enter」キーを押してアプリを実行する
  pyautogui.press("Enter")
  time.sleep(interval)

  # 「Hello, World!」と入力する
  pyautogui.typewrite("Hello, World!", interval = 0.1)
  time.sleep(interval)

  # 「Ctrl」「Shift」「s」で「名前を付けて保存」を開く
  pyautogui.hotkey("Ctrl", "Shift", "s")
  time.sleep(interval)

  # 保存先のファイル名を入力する
  pyautogui.write(filename)
  time.sleep(interval)

  # 「Enter」キーを押して保存する
  pyautogui.press("Enter")

// 実行結果

「ファイル名を指定して実行」を開いたとき
Notepad
「メモ帳」を開いたとき
open
テキストを入力したとき
typing-text
「名前を付けて保存」を開いたとき
test.txt
上書き保存するとき
overwrite-save

上記のサンプルプログラムで、メモ帳の操作を自動化できます。pyautogui.typewrite()で入力する文字列を変えることで、さまざまな場面に応用することが可能です。

アプリに設定されている「ショートカットキー」を活用すると、ファイルの保存まで自動化できることがメリットです。ただし、ファイル名が重複している場合はポップアップが表示されて保存できないため、「filename変数」で別のファイル名を指定しましょう。

なお、このように本格的なアプリの操作を自動化するときは、可能な限りマウスではなくキーボード操作で行うのがポイントです。タスクバーのメニューなどの座標を直接指定する方法は、誤作動のリスクが大きい危険な方法なので注意が必要です。

PCのモニターには、さまざまな解像度のものがあります。現在のPC・モニターで指定した座標は、ほかの環境には必ずしも当てはまらず、誤作動が起きてしまうかもしれません。

そのため、本プログラムのように「ファイル名を指定して実行」からアプリを開いたり、アプリ操作はショートカットキーで行うようにすることが重要です。

「Google Chrome」でWebサイトを検索する

PyAutoGUIを使いこなせば、Google ChromeのようなWebブラウザの操作も自動化できます。Google Chromeブラウザで現在の天気を確認し、その画面キャプチャを保存するプログラムを作成してみましょう。

// サンプルプログラム

# coding: UTF-8

# 「pyautogui」ライブラリをimportする
import pyautogui

# 「time」ライブラリをimportする
import time

# main()関数|プログラムのエントリーポイント
if __name__ == "__main__":

  # 自動入力のインターバル時間を設定する
  interval = 0.5
  
  # 「Win」と「r」の同時押しで「ファイル名を指定して実行」を開く
  pyautogui.hotkey("Win", "r")
  time.sleep(interval)

  # 「Google Chrome」アプリを開く
  # すでに文字列が入力されている可能性があるため、削除してから入力する
  pyautogui.press("Delete")
  pyautogui.write("Chrome")
  time.sleep(interval)

  # 「Enter」キーを押してアプリを実行する
  pyautogui.press("Enter")
  time.sleep(interval)

  # 検索ウィンドウに「Weather」と入力する
  pyautogui.typewrite("Weather", interval = 0.1)
  time.sleep(interval)

  # 「Enter」キーを押して検索を実行する
  pyautogui.press("Enter")
  time.sleep(interval)
  
  # スクリーンショットを撮影して「Weather.png」という名称で保存する
  screen_shot = pyautogui.screenshot() 
  screen_shot.save("Weather.png")

// 実行結果

「ファイル名を指定して実行」を開いたとき
specification
検索ワードの入力時
searchword
Weather.png
weather

PyAutoGUIを活用すれば、このような複雑な操作を短いソースコードで実現できます。

なお、上記のソースコードを実行するためには、「Pillow(PIL)」という画像処理ライブラリが必要です。実行時にエラーが表示される場合は、Pillowがインストールされていないということなので、コマンドプロンプトを開いて以下のPIPコマンドを入力してください。

py -m pip install --upgrade pip

これは、Pythonのパッケージ「PIP」を最新バージョンに更新するものです。アップデートが完了すると、以下のように「Successfully installed pip」と表示されます。

Successfullyinstalledpip

続いて次のPIPコマンドを入力して、「Pillow(PIL)」をインストールしましょう。

py -m pip install pillow
Pillow

「ペイント」で図形を描画する

PyAutoGUIはマウスの細かな操作も自動化できるため、「ペイント」のようなグラフィックアプリ・画像編集アプリにも活用できます。以下のようなサンプルコードを実行すると、マウスが自動的に動いて簡単な図形を描画できます。

// サンプルプログラム

# coding: UTF-8

# 「pyautogui」ライブラリをimportする
import pyautogui

# 「time」ライブラリをimportする
import time

# main()関数|プログラムのエントリーポイント
if __name__ == "__main__":

  # 自動入力のインターバル時間を設定する
  interval = 0.25
  
  # 「Win」と「r」の同時押しで「ファイル名を指定して実行」を開く
  pyautogui.hotkey("Win", "r")
  time.sleep(interval)

  # 「mspaint」アプリを開く
  # すでに文字列が入力されている可能性があるため、削除してから入力する
  pyautogui.press("Delete")
  pyautogui.write("mspaint")
  time.sleep(interval)

  # 「Enter」キーを押してアプリを実行する
  pyautogui.press("Enter")
  time.sleep(interval)

  # 「Ctrl」と「w」の同時押しで「サイズ変更と傾斜」を開く
  pyautogui.hotkey("Ctrl", "w")
  time.sleep(interval)

  # 「右矢印」キーを押す
  pyautogui.press("Right")
  time.sleep(interval)
  
  # 「Tab」キーを3回押して項目を進める
  for i in range(3):
    pyautogui.press("Tab")
    time.sleep(interval)
    
  # 「m」キーを押して「縦横比を維持する」を解除する
  pyautogui.press("m")
  time.sleep(interval)
  
  # スクリーンサイズを取得する
  width, height = pyautogui.size()

  # 「Shift」と「Tab」の同時押しで前の項目に戻る
  pyautogui.hotkey("Shift", "Tab")
  time.sleep(interval)
  
  # カンバスの高さを入力する
  pyautogui.write(str(height))
  time.sleep(interval)
  
  # 「Shift」と「Tab」の同時押しで前の項目に戻る
  pyautogui.hotkey("Shift", "Tab")
  time.sleep(interval)
  
  # カンバスの横幅を入力する
  pyautogui.write(str(width))
  time.sleep(interval)

  # 「Enter」キーを押してカンバスサイズを変更する
  pyautogui.press("Enter")
  time.sleep(interval)
  
  # 「Win」と「上矢印」の同時押しでウィンドウを最大化する
  pyautogui.hotkey("Win", "Up")
  time.sleep(interval)

  # ブラシツールで図形を描画する
  pyautogui.moveTo(width / 2, height / 2, duration = 1)
  pyautogui.dragRel(100, 100, duration = 1, button = "left")
  pyautogui.dragRel(-300, 100, duration = 1, button = "left")
  pyautogui.dragRel(-100, -500, duration = 1, button = "left")
  pyautogui.dragRel(500, 300, duration = 1, button = "left")    
  pyautogui.dragTo(width / 2, height / 2, duration = 1, button = "left")
  
  # 「F11」キーを押して全画面表示にする
  pyautogui.press("F11")

  # スクリーンショットを撮影して「Paint.png」という名称で保存する
  screen_shot = pyautogui.screenshot() 
  screen_shot.save("Paint.png")

// 実行結果

描画中
drawing
Paint.png
paint

人間が手で行っている動作を分割して、PyAutoGUIの関数で正しくコマンドを指定することで、このような複雑な作業の自動化も可能になります。細かな処理を記載すれば、より機能性が高い自動化プログラムも作成できるので、ぜひさまざまなパターンを試してみてください。

PyAutoGUIで知っておくべきこと

PyAutoGUIで知っておくべきこと

PyAutoGUIを活用してさまざまなロボットを作るために、以下の3つの点も合わせて理解しておきましょう。

  • PyAutoGUIは「完全無料」で使えるの?
  • PyAutoGUIの「フェイルセーフ機能」について
  • PyAutoGUIで「日本語」を入力する方法

PyAutoGUIは「完全無料」で使えるの?

PyAutoGUIは「完全無料」で使えます。個人利用はもちろん、商用目的のプログラムであっても、ライセンス料金やソースコードの公開などはいっさい必要ありません。なぜなら、PyAutoGUIは「BSDライセンス」で開発された、オープンソースライブラリだからです。ただし、BSDライセンスは「ライセンス文書の原文」を添付する必要があるため、アプリの公開販売時などは注意してください。

PyAutoGUIの「フェイルセーフ機能」について

PyAutoGUIには「フェイルセーフ機能」があります。これは、PyAutoGUIのメソッドで自動操作を行っているときに、手動でマウスをスクリーンのコーナー部分に移動させると、自動操作が停止するというものです。移動させる部分は、左上・右上・左下・右下いずれでも大丈夫です。ただし、マウスの自動操作中の場合は、強く動かす必要があります。

フェイルセーフ機能は、RPAが予期せぬ動作や不具合を起こしたときに、自動操作を中止するための「安全機能」です。たとえば、おかしな場所をクリックして重要なデータが変更されているときや、不要なポップアップが多く表示されているときなどです。フェイルセーフ機能が働くと、以下のような画面が表示されます。

fail-safe

メッセージに記載されているとおり、フェイルセーフ機能はオフにできます。フェイルセーフ機能が不要だと感じた場合は、以下のコードをプログラム先頭に追加しておくと、マウスをコーナーに移動させても自動操作が停止しません。

pyautogui.FAILSAFE = False

しかし、フェイルセーフ機能をオフにすることは推奨されていません。たとえ「Escapeキー長押しで終了する」など、独自の停止方法を実装したとしても、なんらかの不具合で動作しないかもしれません。予期せぬトラブルを避けるためにも、フェイルセーフ機能はオフにしないようにしましょう。

PyAutoGUIで「日本語」を入力する方法

冒頭で触れたように、PyAutoGUIでは日本語の入力を自動化することはできません。しかし、「pyperclip」というモジュールと組み合わせることで、PyAutoGUIでも問題なく日本語入力を自動化できます。具体的な方法は、まず「pyperclip.copy()」関数でクリップボードに日本語をコピーし、「pyautogui.hotkey()」関数で貼り付けるというものです。

pyperclip.copy(日本語テキスト)
pyautogui.hotkey("Ctrl", "v")

PyAutoGUIとpyperclipを組み合わせて、日本語を自動入力する手順について、以下のサンプルコードで確認しましょう。

// サンプルプログラム

# coding: UTF-8

# 「pyautogui」ライブラリをimportする
import pyautogui

# 「pyperclip」ライブラリをimportする
import pyperclip

# 「threading」ライブラリをimportする
import threading

# program()関数|検証用のGUIアプリを起動する
# この関数の内容については無視してOK
def program():

  # 「tkinter」ライブラリをimportする
  import tkinter
  
  # Tkinterのメインウィンドウを最大化して表示する
  root = tkinter.Tk()
  root.state("zoomed")

  # テキストボックスを配置する
  tkinter.Text(root, font=("", 30)).pack(expand = True, fill = tkinter.BOTH)
  
  # Tkinterのイベント処理を実行する
  root.mainloop()

# main()関数|プログラムのエントリーポイント
if __name__ == "__main__":

  # 別スレッドで「program()」関数を実行する
  # この部分の内容については無視してOK
  thread = threading.Thread(target = program)
  thread.start()
  
  # 画面の中央部分でマウスをクリックする
  pos_x, pos_y = pyautogui.size()
  pyautogui.click(x = pos_x / 2, y = pos_y / 2, duration = 1)
  
  # 「こんにちは!」というテキストを入力する
  pyperclip.copy("こんにちは!") # クリップボードに日本語をコピーする
  pyautogui.hotkey("Ctrl", "v") # 「Ctrl」「v」のショートカットキーで張り付ける
  
  # Tkinter用のスレッドが終了するのを待つ
  # この部分の内容については無視してOK
  thread.join()

// 実行結果

pyautogui.hotkey

上記のサンプルプログラムを実行できない場合は、コマンドを開いて以下のPIPコマンドを入力して、pyperclipをインストールしましょう。

py -m pip install pyperclip

上記の方法では、指定したテキストが一気に入力されます。1文字ずつ入力したい場合は、以下のように自作関数でforループを回し、コピー&ペーストを繰り返すといいでしょう。

// サンプルプログラム

# coding: UTF-8

# 「pyautogui」ライブラリをimportする
import pyautogui

# 「pyperclip」ライブラリをimportする
import pyperclip

# 「threading」ライブラリをimportする
import threading

# 「time」ライブラリをimportする
import time

# program()関数|検証用のGUIアプリを起動する
# この関数の内容については無視してOK
def program():

  # 「tkinter」ライブラリをimportする
  import tkinter
  
  # Tkinterのメインウィンドウを最大化して表示する
  root = tkinter.Tk()
  root.state("zoomed")

  # テキストボックスを配置する
  tkinter.Text(root, font=("", 30)).pack(expand = True, fill = tkinter.BOTH)
  
  # Tkinterのイベント処理を実行する
  root.mainloop()
  
# write()関数|指定した日本語のテキストを1文字ずつ入力する
def write(string, duration):

  # 1文字ずつ順番に入力していく
  for c in string:

    # クリップボードに日本語をコピーする
    pyperclip.copy(c)

    # 「Ctrl」「v」のショートカットキーで張り付ける
    pyautogui.hotkey("Ctrl", "v")

    # 指定した時間だけ待機する
    time.sleep(duration)

# main()関数|プログラムのエントリーポイント
if __name__ == "__main__":

  # 別スレッドで「program()」関数を実行する
  # この部分の内容については無視してOK
  thread = threading.Thread(target = program)
  thread.start()
  
  # 画面の中央部分でマウスをクリックする
  pos_x, pos_y = pyautogui.size()
  pyautogui.click(x = pos_x / 2, y = pos_y / 2, duration = 1)
  
  # 「こんにちは!」というテキストを0.25秒間隔で入力する
  write("こんにちは!", 0.25)
  
  # Tkinter用のスレッドが終了するのを待つ
  # この部分の内容については無視してOK
  thread.join()

// 実行結果

roop

PyAutoGUI単体ではなく、pyperclipと組み合わせる必要があるため手間はかかりますが、上記のように日本語の自動入力を実現すること自体は可能です。日本語入力を活用することで、より便利なRPA・ロボットを作成できるでしょう。

PyAutoGUIでさまざまなPC操作を自動化しよう

PyAutoGUIでさまざまなPC操作を自動化しよう

PyAutoGUIを活用することで、PCで行うさまざまな作業を自動化できます。今回ご紹介した関数・メソッドを組み合わせれば、キーボードとマウスの入力をプログラムで指示できるため、データ入力やアプリの操作などを年中無休で継続的に行えるようになります。ぜひこの機会に、PyAutoGUIによるPC操作の自動化にチャレンジしてみてください。

アクセスランキング 人気のある記事をピックアップ!

    コードカキタイがオススメする記事!

    1. 子供におすすめのプログラミングスクール10選!学習メリットや教室選びのコツも紹介

      2024.01.26

      子供におすすめのプログラミングスクール10選!学習メリットや教室選びのコツも紹介

      #プログラミングスクール

    2. 【完全版】大学生におすすめのプログラミングスクール13選!選ぶコツも詳しく解説

      2022.01.06

      【完全版】大学生におすすめのプログラミングスクール13選!選ぶコツも詳しく解説

      #プログラミングスクール

    3. 【未経験でも転職可】30代におすすめプログラミングスクール8選!

      2024.01.26

      【未経験でも転職可】30代におすすめプログラミングスクール8選!

      #プログラミングスクール

    4. 初心者必見!独学のJava学習方法とおすすめ本、アプリを詳しく解説

      2024.01.26

      初心者必見!独学のJava学習方法とおすすめ本、アプリを詳しく解説

      #JAVA

    5. 忙しい社会人におすすめプログラミングスクール15選!失敗しない選び方も詳しく解説

      2024.01.26

      忙しい社会人におすすめプログラミングスクール15選!失敗しない選び方も詳しく解説

      #プログラミングスクール

    1. 【無料あり】大阪のおすすめプログラミングスクール14選!スクール選びのコツも紹介

      2022.01.06

      【無料あり】大阪のおすすめプログラミングスクール14選!スクール選びのコツも紹介

      #プログラミングスクール

    2. 【目的別】東京のおすすめプログラミングスクール20選!スクール選びのコツも徹底解説

      2024.01.26

      【目的別】東京のおすすめプログラミングスクール20選!スクール選びのコツも徹底解説

      #プログラミングスクール

    3. 【無料あり】福岡のおすすめプログラミングスクール13選!選び方も詳しく解説

      2024.01.26

      【無料あり】福岡のおすすめプログラミングスクール13選!選び方も詳しく解説

      #プログラミングスクール

    4. 【徹底比較】名古屋のおすすめプログラミングスクール13選!選び方も詳しく解説

      2024.01.26

      【徹底比較】名古屋のおすすめプログラミングスクール13選!選び方も詳しく解説

      #プログラミングスクール

    5. 【徹底比較】おすすめのプログラミングスクール18選!失敗しない選び方も徹底解説

      2024.01.26

      【徹底比較】おすすめのプログラミングスクール18選!失敗しない選び方も徹底解説

      #プログラミングスクール