2014-11-08 142 views
2

我試圖將以下行爲編碼到sikuli腳本中,即使使用該文檔也無法找到它。onChange()sikuli的示例

我想在屏幕上找到一些東西(這實際上是文本),然後在右邊的文本發生變化時執行按鍵動作。我一直在尋找find().right()來定義一個區域以及onChange()observer();但是爲了把它們放在一起,並沒有真正理解文檔。

回答

2

我假設你使用Sikuli IDE和jython寫入。

首先,嘗試使用較小的區域,因爲find().right()會創建一個區域,該區域在某種程度上很大(延伸至屏幕末端),如果您爲新創建的區域指定較小的尺寸以減少計算能力當使用觀察員時。其次,指定觀察者所需的掃描速度(也影響效率和計算所需功率),它是腳本開始處的一個設置,用於定義在觀察區域上每秒執行多少次掃描。代碼行如下所示:Settings.ObserveScanRate = 10,這將每秒執行10次掃描。

然後,寫的代碼的兩行來啓動其例如觀察者: reg.onChange(50,onchangedFunction)reg.observe(10,background=False)

對於reg.onchange(50,onchangedFunction) 50是改變時,功能onchangedFunction將實施的像素的數量, (50是可能的最小數字,您可能希望在您檢測到文本變化時使用它)

對於reg.observe(10,background=False),在此處開始觀察區域以檢測任何更改,10是系統的秒數將觀察該地區,而第二個參數是真或假,是否您希望掃描運行在background(true)或代碼停止,直到掃描結束(false)。

,那麼你需要實現的功能onchangedFunction(這只是一個名字),它可能是這樣的:

def onchangedFunction(event): 
     click(img) #and the rest of the algorithm to be implemented on change 

但照顧的功能應該是使用它的reg.onchange()之前的實施和在允許它被調用的範圍內。

最後調用reg.stopObserver()

我想你的代碼應該是這樣的:

Settings.ObserveScanRate = 10 
def onchangedFunction(event): 
      click(img2) 
reg= Region(find(img1).right()) 
reg.onChange(50,onchangedFunction) 
reg.observe(10,background=False) 
reg.stopObserver() 
+0

OK,我在與我以前所編碼的正確軌道。然而,當按照你的例子編寫一個最小工作示例時,我得到一個'ClassCastException':'[error] java.lang.ClassCastException(java.lang.ClassCastException:org.python.core.PyFunction不能轉換爲org.sikuli。 script.SikuliEventObserver)'。這發生在調用'onChange()'的行。 – 2014-11-10 19:08:11

+0

@ NathanS.Watson-Haigh這是因爲find()的返回值是匹配而不是區域對象。這可以簡單地通過用reg = Region(find(img1).right())替換reg = find(img1).right()來解決。 – 2014-11-10 19:44:20