在事件处理程序 Sikuli

问题描述

我有一个永远在后台运行的 Observer,它正在寻找一个特定的 pattern,并且会在 triggererd 时调用处理程序 rdp_handler

onAppear("1615387075076.png",rdp_handler)
observeInBackground()

处理程序应该等待 FOREVER 或等待 pattern 消失:

print "rdp_handler called"
waitVanish("1615387075076.png",FOREVER)
print "rdp_handler finished"

基本上我想做的是暂停脚本的执行,直到 pattern 消失,显然这不起作用,因为处理程序是在 Thread 中执行的,所以 {{ 1}} 已暂停,但我的主程序仍在运行。

我尝试 Thread 挂起 java 进程,但我得到以下回溯(在添加到 site-package 目录的路径后):

import psutil

经过一番研究,我发现我只能导入 [error] script [ OrderCreate ] stopped with error in line 11 [error] NotImplementedError ( platform java13.0.2 is not supported ) [error] --- Traceback --- error source first line: module ( function ) statement 143: __init__ ( <module> ) raise NotImplementedError('platform %s is not supported' % sys.platform) 11: main ( <module> ) import psutil [error] --- Traceback --- end -------------- 和 pur java 库,psutil 中有一些 python 代码...

我的问题来了:你知道如何暂停主程序直到处理程序完成他的工作吗?

解决方法

试试:

import time
while(not waitVanish("1615387075076.png",FOREVER)):
    time.sleep(1)

这应该每秒检查一次是否消失。

,

在尝试了一些时髦的东西之后,我设法让一些东西工作,唯一的问题是:我必须在脚本的关键部分添加一些 if 语句:

一开始我定义了我的事件并启动了我的观察者:

my_event = onAppear("1615387075076.png")
observeInBackground()

然后我创建了一个函数:

def rdp_handler(my_event):
    if exists("1615387075076.png"):
        print("RDP disconnected")
        waitVanish("1615387075076.png",FOREVER)
        print("RDP reconnected")
        setActive(my_event)

现在每次与界面交互时,我都会这样做:

if hasEvents():
    SageUtils.rdp_handler(my_event)

hasEvents() 返回 True 如果我的模式出现在我的程序的某个时间,如果它是 True,我会调用 rdp_handler(my_event) 来检查 pattern仍然在屏幕上,如果是,那么它将等待它消失,并重新激活我在观察者中使用的事件。

它很丑,但嘿,它有效。

我仍然愿意接受更好/更清洁的解决方案,但到目前为止我很高兴。

,

RaiMan from SikuliX

您想要的功能目前无法作为 SikuliX 的功能提供。

这是您可以在此处获得的最佳答案: https://stackoverflow.com/a/16899837/1918124

...但确实有一个隐藏功能,至少允许阻止脚本,下次它尝试发出鼠标动作时。 我会在接下来的几天里尝试处理你的案子,这是否主要有效。

如果您有兴趣,add an issue here,以便您可以跟进。