在sikuli中onAppear()的行为混乱

时间:2013-05-23 07:24:59

标签: observer-pattern sikuli

def stop(event):
    popup("Done")
    event.region.stopObserver()
    pass
wmp = App("C:\\Program Files\\Windows Media Player\\wmplayer")
wmp.open()
wait(2)
click(find(Pattern("play_button.png").exact()))
popup("Started Playing")
wait(3)
onAppear(Pattern("stop_button.png").exact(),stop)
observe(FOREVER)

在上面的代码片段中,我尝试在windows media player中播放一个mp3文件并观察它直到出现停止按钮,在它出现后,它会显示弹出消息“Done”。当我第一次运行此程序时,弹出消息显示一次,当我再次运行它时,它会显示两次弹出消息,第三次显示弹出消息三次。有人可以解释一下为什么会发生这种情况,虽然我在代码片段中只提供了一个popup("Done")吗?

3 个答案:

答案 0 :(得分:3)

我的猜测是,这是IDE中的某种缓存问题: 在执行脚本之后/之前似乎没有重置默认区域,因此每次运行脚本时,都会再次添加onAppear侦听器,这会同时导致多个事件。

这只是猜测,但如果我是对的,你可以使用

来解决这个问题
Region screenRegion = Region.create(Screen(0).x, Screen(0).y, Screen(0).w, Screen(0).h)
screenRegion.onAppear(Pattern("stop_button.png").exact(),stop)
screenRegion.observe(FOREVER)

这将创建一个新的Region,每个脚本都运行,而不是将onAppear监听器应用于默认的Region。

答案 1 :(得分:1)

我无法在我的环境中重现这个问题,但根据描述我有2个建议:

OR

答案 2 :(得分:0)

  1. 您应该将onAppear侦听器限制为特定区域以提高性能

  2. 终止程序时必须停止观察者。 region.stopObserver()

  3. 根据Sikuli文档,您应该使用observe(background=True)代替observe(FOREVER)