onChange() Example for sikuli
我正在尝试将以下行为编码为sikuli脚本,并且似乎无法弄清楚,即使使用文档。
我想在屏幕上找到一些东西(这实际上是文本)然后在右边的文本发生变化时执行击键动作。 我一直在寻找find().right()来定义一个区域以及onChange()和observer(); 但是为了将它们组合在一起,并没有真正理解文档。
我假设你正在使用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是系统观察区域的秒数,第二个参数是true或false,无论你是否希望扫描在background(true)或代码停止直到扫描结束(false)。
那么你需要实现函数onchangedFunction(这只是一个名字),它可能是这样的:
1 2
| def onchangedFunction(event):
click(img) #and the rest of the algorithm to be implemented on change |
但请注意,因为函数的实现应该在reg.onchange()之前使用它并在允许它被调用的范围内。
最后调用reg.stopObserver()
我认为你的代码应该是这样的:
1 2 3 4 5 6 7
| Settings.ObserveScanRate = 10
def onchangedFunction(event):
click(img2)
reg= Region(find(img1).right())
reg.onChange(50,onchangedFunction)
reg.observe(10,background=False)
reg.stopObserver() |
-
好吧,我以前用过的代码编写了正确的曲目。 但是,根据您的示例编写最小工作示例时,我得到ClassCastException:[error] java.lang.ClassCastException ( java.lang.ClassCastException: org.python.core.PyFunction cannot be cast to org.sikuli.script.SikuliEventObserver )。 这发生在调用onChange()的行上。
-
@ NathanS.Watson-Haigh这是因为find()的返回值是匹配而不是region对象。 这可以通过用reg = Region替换reg = find(img1).right()来解决(find(img1).right())