PyAutoGUIでユーザーフォームのコンボボックスを操作する方法

Python

みなさん,こんにちは.
シンノユウキ(y_stadio)です.

この記事はPyAutoGUIでユーザーフォームのGUIテストを自動化する連載の第5回です.

今回はPyAutoGUIでユーザーフォームのコンボボックスを操作する方法を紹介したいと思います.

では行きましょう!

前回のまとめ

前回の記事はこちらです:

前回はPyAutoGUIを用いてVBAユーザーフォームのテキストボックスの操作を行ってみました.全体のコードは以下のようになりました:

import pyautogui as pg
import pyperclip

class UserForm:
    pass

class Control:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def click(self, cliks=1, interval=0, button='left', pause=1):
        pg.click(self.x, self.y, clicks=cliks, interval=interval, button=button, pause=pause)

class TextBox(Control):
    def set_text(self, string_):
        self.click()
        pyperclip.copy(string_)
        pg.hotkey('ctrl', 'v')
    
    def clear_text(self):
        self.click()
        pg.hotkey('ctrl', 'a')
        pg.press('delete')

class ComboBox(Control):
    pass

class OptionButton(Control):
    pass

class CheckBox(Control):
    pass

class CommandButton(Control):
    pass

if __name__ == "__main__":
    # 左上をクリックしてウインドウをアクティブに
    pg.click(1, 1, pause=2.0)

    # フォームを開く
    btn_show_form = Control(674, 265)
    btn_show_form.click()

    # 名前を入力
    txt_name = TextBox(947,391)
    txt_name.set_text('名前')
        
    # 男性ボタンをクリック
    opt_men = OptionButton(915, 446)
    opt_women = OptionButton(915, 492)
    opt_men.click()
    
    # 年齢を選択
    cmb_age = ComboBox(915, 547)
    cmb_age.click()
    pg.press('down')

    # 最終確認1をクリック
    chk_1 = CheckBox(844, 600)
    chk_1.click()

    # 最終確認2をクリック
    chk_2 = CheckBox(844, 630)
    chk_2.click()

    # OKボタンをクリックする
    btn_ok = CommandButton(1040,677)
    btn_ok.click()

    # 終了を知らせる
    pg.alert('終了しました')

今回はその続きです.

コンボボックスの特徴

はじめに,VBAユーザーフォームにおけるコンボボックスの特徴を紹介します.

現在,私が操作しているユーザーフォームのコンボボックスは,以下のようになっています:

コンボボックスの右側にドロップダウンが表示され,それで項目を選択できるようになっています.

一見リストボックスのようにも見えるのですが,実はユーザーフォームのリストボックスでは,ドロップダウン形式にはできません.ドロップダウン形式のリストを作成するためには,コンボボックスとして作成し,そのプロパティ:Styleを「fmStyleDropDownList」としなければなりません.デフォルトの設定ではないので注意してください.

コンボボックスを操作してみよう!

今回紹介しているコンボボックスについての説明が終わったところで,以降はコンボボックスをPyAutoGUIでどのように操作していくか紹介していきたいと思います.

現在の処理

現在は,コンボボックスで年齢を選択するために,以下のような処理を行っています:

# 年齢を選択
cmb_age = ComboBox(915, 547)
cmb_age.click()
pg.press('down')

コンボボックス自体をクリックし,下方向のキーを押すことでドロップダウンリストから項目を選択しています.

ただし,このままの方法だと,以下の2つの問題があります:

  • 選択する年齢を変更する際にコードを書き直さなくてはならない
  • 連続入力の際にリストが初期化されない

以降でこれらの問題を解決できるよう,処理を変更していきましょう.

コンボボックスを初期化するメソッドを定義しよう!

はじめに,コンボボックスを初期化するメソッドを作成しましょう.これも,ComboBoxクラスに追加してくことにします.

実はコンボボックスは選択された状態でBackspaceを押すことで,最初の項目が選択された状態に戻すことができます

この性質を活かした,コンボボックスを初期化するメソッドは以下のようになります:

def clear_box(self):
    self.click()
    pg.press('backspace')

これを年齢を選択する前に行うようにします.

コンボボックスを選択するメソッドを定義しよう

次にコンボボックスを選択するメソッドを定義します.コンボボックスで色々な項目を選択していきたいといった場合,選択したい項目のインデックスを指定できたら便利そうです.その場合,そのインデックスを受け取り,その回数だけ下方向キーを押すといった方法で実装できそうです.以下でいいのではないでしょうか:

def select_box(self, index):
    for i in range(index):
        pg.press('down')

一番最初の項目をクリックしたい場合,indexに0を,2番めの場合は1を指定することでそれをクリックできます.

メインルーチンを変更

では,以上を踏まえてメインルーチンを変更しましょう.以下のように変わりました:

# Before
    cmb_age = ComboBox(915, 547)
    cmb_age.click()
    pg.press('down')

# After
    cmb_age = ComboBox(915, 547)
    cmb_age.clear_box()
    cmb_age.select_box(1)

これで選択したい項目を変更する際や,連続入力の際などでも柔軟に対応できるようになりました.

まとめ

今回はPyAutoGUIでコンボボックスを操作する方法についてまとめました.全体のコードは以下のようになります.参考にしてください:

import pyautogui as pg
import pyperclip

class UserForm:
    pass

class Control:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def click(self, cliks=1, interval=0, button='left', pause=1):
        pg.click(self.x, self.y, clicks=cliks, interval=interval, button=button, pause=pause)

class TextBox(Control):
    def set_text(self, string_):
        self.click()
        pyperclip.copy(string_)
        pg.hotkey('ctrl', 'v')
    
    def clear_text(self):
        self.click()
        pg.hotkey('ctrl', 'a')
        pg.press('delete')

class ComboBox(Control):
    def clear_box(self):
        self.click()
        pg.press('backspace')
    
    def select_box(self, index):
        for i in range(index):
            pg.press('down')

class OptionButton(Control):
    pass

class CheckBox(Control):
    pass

class CommandButton(Control):
    pass

if __name__ == "__main__":
    # 左上をクリックしてウインドウをアクティブに
    pg.click(1, 1, pause=2.0)

    # フォームを開く
    btn_show_form = Control(674, 265)
    btn_show_form.click()

    # 名前を入力
    txt_name = TextBox(947,391)
    txt_name.set_text('名前')
        
    # 男性ボタンをクリック
    opt_men = OptionButton(915, 446)
    opt_women = OptionButton(915, 492)
    opt_men.click()
        
    # 年齢を選択
    cmb_age = ComboBox(915, 547)
    cmb_age.clear_box()
    cmb_age.select_box(1)

    # 最終確認1をクリック
    chk_1 = CheckBox(844, 600)
    chk_1.click()

    # 最終確認2をクリック
    chk_2 = CheckBox(844, 630)
    chk_2.click()

    # OKボタンをクリックする
    btn_ok = CommandButton(1040,677)
    btn_ok.click()

    # 終了を知らせる
    pg.alert('終了しました')

連載目次

  1. PyAutoGuiでVBAのユーザーフォームのGUIテストを自動化する!
  2. PyAutoGUIを始める第一歩と基本的な使い方を紹介します
  3. PyAutoGUIでユーザーフォームの 簡単なGUIテストをやってみる
  4. PyAutoGUIでユーザーフォームのテキストボックスを操作する方法
  5. PyAutoGUIでユーザーフォームのコンボボックスを操作する方法現在のページ
  6. PyAutoGUIでユーザーフォームのチェックボックスのチェックを全て外す方法|画像認識の活用
  7. PyAutoGUIでユーザーフォームのテストデータをExcelファイルから読み取る方法
  8. PythonファイルをEXEファイル化する「Pyinstaller」の使い方を紹介します
この記事の著者
管理栄養士/修士(人間生活化学)

シンノユウキです。管理栄養士/修士(人間生活科学)/ 栄養系の出版社で勤務/ 会社員ブロガーです.科学的に正しくかつ妥当なことをお伝えしていきます.プログラミングが趣味なので関連記事も書いています.

シンノユウキをフォローする
PythonPyAutoGui
シンノユウキをフォローする
みんな栄養に頼りすぎてる
タイトルとURLをコピーしました