1
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 媒体播放器中播放一个 mp3 文件并观察它直到出现停止按钮,它出现后,它会显示弹出消息“完成”。当我第一次运行这个程序时,弹出消息显示一次,当我再次运行它时,它显示弹出消息两次,第三次显示它三次。有人可以解释一下为什么会这样,尽管我只给出了一个popup("Done")在代码片段中只给出了一个?

4

3 回答 3

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)

这将在每个脚本运行时创建一个新区域,并且不会将 onAppear 侦听器应用于默认区域。

于 2013-05-25T15:22:57.820 回答
1

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

或者

于 2013-05-23T11:35:43.307 回答
0
  1. 您应该将 onAppear 侦听器限制在特定区域以提高性能

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

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

于 2013-05-31T09:41:32.300 回答