问题描述
我有一个永远在后台运行的 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
仍然在屏幕上,如果是,那么它将等待它消失,并重新激活我在观察者中使用的事件。
它很丑,但嘿,它有效。
我仍然愿意接受更好/更清洁的解决方案,但到目前为止我很高兴。
,您想要的功能目前无法作为 SikuliX 的功能提供。
这是您可以在此处获得的最佳答案: https://stackoverflow.com/a/16899837/1918124
...但确实有一个隐藏功能,至少允许阻止脚本,下次它尝试发出鼠标动作时。 我会在接下来的几天里尝试处理你的案子,这是否主要有效。
如果您有兴趣,add an issue here,以便您可以跟进。