2014-11-08 697 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