画像識別で目的の場所(オブジェクト)を指定するなど、GUIを自動で操作するフリーツール:「sikuliX」。
その sikuliX での条件分岐(if文)について、本記事で紹介していこうと思います。
なお、sikuliXの構文は、基本的にPython の構文がそのまま利用できます。そのため、一部Pythonの文法の説明になっている部分があります。
構文
sikuliXで動かす場合、インデントの位置(Tabキー:1つ分)も正確に設定しないと、エラーとなりプログラムが実行されません。
基本形の3パターン
条件分岐を記載したい場合の構文です。
基本の構文は、以下の3パターンのいずれかになります。
if “条件文”:
条件が真(True)の時に実行される処理
構文例
if a < 0:
print(“a is Negative number”)
実行結果
aが負の値の時、「a is Negative number」が表示される。
aが負の値ではない時、何も表示されない。
if “条件文”:
条件が真(True)の時に実行される処理
else:
「if “条件文”」が偽(False)の時に実行される処理
構文例
if a < 0:
print(“a is Negative number”)
else:
print(“a is 0 or Positive number”)
実行結果
aが負の値の時、「a is Negative number」が表示される。
aが負の値ではない時、「a is 0 or Positive number」が表示される。
if “条件文”:
条件が真(True)の時に実行される処理
elif “条件文”:
「if “条件文”」が偽(False)かつ「elif “条件文”」が真(True)の時に実行される処理
else:
「if “条件文”」および「elif “条件文”」が共に偽(False)の時に実行される処理
構文例
if a < 0:
print(“a is Negative number”)
elif a == 0:
print(“a is 0”)
else:
print(“a is Positive number”)
実行結果
aが負の値の時、「a is Negative number」が表示される。
aが0の時、「a is 0」が表示される。
aが負の値でも0でもない時、「a is Positive number」が表示される
条件文で使える演算子は、以下の記事を参考にしてもらえると良いかと思います。
さらに、sikuliX および Python では、if文を入れ子にしてプログラムを記載することも可能です。
条件式で使われる構文の例
条件分岐で使う機会が多そうな構文の例を示します。
if exist( “目安にするオブジェクト” ):
オブジェクトが存在している場合に実行する処理
exists( ) は、オブジェクトが存在することを確認するコマンドです。これを条件式に充てることで、「指定したオブジェクトが存在する場合は・・・」という条件分岐が作れます。
if not exist( “目安にするオブジェクト” ):
オブジェクトが存在しない場合に実行する処理
not exists( ) は、オブジェクトが存在しないことを確認するコマンドです。すなわち、exists() の逆です。これを条件式に充てることで、「指定したオブジェクトが存在しない場合は・・・」という条件分岐が作れます。
もうひと工夫すると以下のようなことも可能です。
if exist( “目安にするオブジェクト”, タイムアウト時間[秒] ):
タイムアウト時間で設定した間でオブジェクトが存在する場合に、実行する処理
if not exist( “目安にするオブジェクト”, タイムアウト時間[秒] ):
タイムアウト時間で設定した間中 オブジェクトが存在しない場合に、実行する処理
どちらも、[timeout] を設定することで、条件式である exists( ) と not exists( ) の判定に制限時間を設けたものです。
通常、[timeout]を設定しないと、存在有無を確認するためには3秒間待つことになります。この時間を状況に応じて、設定できる方法になります。
例えば、ある入力文字列が不正だった場合に、通常1秒以内に表示されるエラーダイアログがあるとします。このエラーダイアログが「正しい入力文字列を入れた時に表示されない」という条件分岐を行った際に3秒も待つのは、処理速度の低下を招きます。また、1分程度かかることが想定される処理の完了ダイアログを確認したいときに、3秒で条件分岐の判断がされては、得たい結果は得られないでしょう。
こういった事態をさけるために、効果的な条件式(コマンド)になります。
まとめ
今回は、条件分岐(if文)について記載しましたが、条件式は True / False の値が得られれば良いので、Boolean型 の変数を置いても、もちろん構いません。
本記事の内容はあくまで一例なので、色々試してみてください。