1
1

More than 1 year has passed since last update.

[SikuliX] click関数を使いやすくする/独自関数/独自モジュール

Last updated at Posted at 2022-08-31

SikuliX の click(【画像】) は、指定した画像が存在しないとエラー終了します。

test.sikuli
click(存在しない画像)

↓ 実行結果

[error] script [ test ] stopped with error in line 1
[error] FindFailed ( 1661949799027.png: (128x39) in R[0,0 1536x1024]@S(0) )
[error] --- Traceback --- error source first
line: module ( function ) statement 
1: main (  <module> )     click("1661949799027.png")
[error] --- Traceback --- end --------------

画像の表示がされるまで待機するwait関数と組み合わせることで、
表示されてからクリックという操作にもできますが、
毎回 wait関数とclick関数を並べて書くのは面倒です。
そこで、__独自関数__を使用します。


独自関数の定義とexists関数の利用

Pythonの独自関数はdef文を使用します。
また、wait関数は__画像が見つかるまで待機し、見つかり次第先に進む__動きですが、
exists関数を利用すれば、__見つけた画像の場所を返す__動きを行います。

独自関数名は__予約語や定義済みの関数名と衝突しなければ__自由に使えますが、
ここではclick2という独自関数を定義することで、
「①画像が見つけたら」「②クリック」の操作を1行で書くことができるようになります。

sample.sikuli
def click2(img, max_wait=30):
    reg = exists(img, max_wait) # ①画像を見つけたら
    click(reg) # ②クリック

# 使い方
click2(画像) # 30秒以内に見つかればクリック
click2(画像, 5) # 5秒以内に見つかればクリック

画像が見つからない場合、exists関数はNoneを返すため、click(None)は何もせず終了します。ちなみに引数なしでclick()と実行すると、画面の中心をクリックするようです。

また、exists関数は「画像の場所 = Region」を返すので、Regionクラスの持つ関数が利用できます。たとえば highlight関数を利用すると、次のような書き方ができ、実行速度がほとんど変えずに、スローモーションで実行と同じようにクリックする場所をわかりやすく表示させることができます。
便利なのでぜひ使っていただきたい!

sample.sikuli
def click2(img, max_wait=30):
    reg = exists(img, max_wait)
    if reg is None:
        return
    reg.highlightOn()
    click(reg)
    App.highlightAllOff()

# 使い方
click2(画像, 5) # 5秒以内に見つかれば__ハイライトして__クリック

モジュールの利用

プログラム内に独自関数を定義すれば、そのプログラム内では利用可能ですが、プロジェクト全体で使いたい場合、モジュールとして別に定義しておくと便利です。

SikuliX から import する Pythonファイルは、%APPDATA%\Sikulix\Lib\site-packages に格納すればパスを意識せず使うことができます。
また、独自モジュールとして分離する場合、from sikuli import * と書くことで、click関数などのSikuliX標準関数を使うことができます。
独自モジュールを「custom.py」という名称にした場合、下記のようになります。

%APPDATA%\Sikulix\Lib\site-packages\custom.py
# -*- coding: utf-8 -*-
from sikuli import *

def click2(img, max_wait=30):
    reg = exists(img, max_wait)
    if reg is None:
        return
    reg.highlightOn()
    click(reg)
    App.highlightAllOff()

使い方は下記の通り、さらにスッキリ書けるようになります。独自モジュールは頻繁に修正する可能性があるため、reload(【独自モジュール】)を書いておくと変更の反映漏れがなくなって使いやすいです。

sample.sikul
import custom
reload(custom)
from custom import *

click2(画像, 5) # 5秒以内に見つかれば__ハイライトして__クリック

端末に Python用エディタがない場合など、独自モジュールの作成が大変な場合、
独自モジュールも SikuliX で作成し、作成される【独自モジュール】.sikuliフォルダを、フォルダごと %APPDATA%\Sikulix\Lib\site-packages\ へ配備して使うことも可能です。

%APPDATA%\Sikulix\Lib\site-packages\custom.sikul
# -*- coding: utf-8 -*-

from sikuli import *

def click2(img, max_wait=30):
    reg = exists(img, max_wait)
    if reg is None:
        return
    reg.highlightOn()
    click(reg)
    App.highlightAllOff()

こちらの方法だと、site-packages フォルダ内に格納されるモジュール類が
Python標準モジュール独自モジュールか を管理しやすくなります。


参考情報

動作環境

  • Windows 10
  • OpenJDK Runtime Environment Corretto-16.0.1.9.1
  • SikuliX-2.0.5
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1