在GUI事件之间等待

时间:2018-10-22 10:22:30

标签: event-handling apl dyalog

我正在尝试为Dyalog APL中的图形组件编写一个测试,该测试将模拟按钮单击,从而打开新的窗口和击键,以填写表单字段。我的第一种方法是简单地编写一系列QNQ语句以使事件入队:

⎕NQ '#.foo.barButton' 'Select'   ⍝ open window
⎕NQ '#.foo.bar.bazTab' 'Select'  ⍝ select tab in opened window
....

但是,问题在于,如果尚未显示目标对象(例如,在打开窗口时),则⎕NQ失败:

VALUE ERROR: The event contains an invalid object or event name

我尝试在⎕NQ语句之间插入几秒钟的暂停,但这并没有什么区别,因为执行是同步的。

我应该采取什么方法?

2 个答案:

答案 0 :(得分:2)

这里的问题是,单价⎕NQ将消息“发布”到内部队列。当您“ NQ”第二条消息时,第一条消息尚未处理,因此尚未创建目标对象。在⎕NQ中使用1的左参数,它将“发送”消息到对象,而不是“发布”消息。

⎕NQ documentation

在我的机器上,我已执行以下操作:

'⎕se.mb.jd' ⎕wc 'MenuItem' 'jd' ('event' 'select' 'jd')

我有一个函数jd:

∇jd a
[1]   'f'⎕WC'form'
∇

和一个函数foo:

∇foo
[1]   1 ⎕NQ'⎕se.mb.jd' 'select'
[2]    ⎕DL 5
[3]   'done'
∇

当我运行foo时,该窗口会立即弹出,然后有5秒钟的延迟才可以看到会话完成。

您可以尝试吗?然后,我们将看看您在做些什么。

答案 1 :(得分:0)

如果测试函数是异步调用的(使用生成器运算符“&”),则延迟将按预期工作:

∇ Test dummy
    ⎕NQ '#.foo.barButton' 'Select'   ⍝ open window
    ⎕NQ '#.foo.bar.bazTab' 'Select'  ⍝ select tab in opened window
    ....
∇

Test& 0