在 GUI 事件之间等待

Waiting between GUI events

我正在尝试为 Dyalog APL 中的图形组件编写测试,它将模拟打开新 windows 的按钮点击和用于填写表单字段的击键。我的第一种方法是简单地编写一系列 ⎕NQ 语句来排队事件:

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

然而,如果目标对象尚未显示(例如打开 window 时),⎕NQ 会失败:

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

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

我应该采取什么方法?

这里的问题是一个monadic⎕NQ"posts"一个消息到内部队列。当您 "NQ" 第二条消息时,第一条消息尚未处理,因此尚未创建目标对象。使用左参数 1 到 ⎕NQ,它将 "send" 消息发送给对象而不是 "post" 它。

⎕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 时,window 立即弹出,然后在我看到会话完成之前有 5 秒的延迟。

你能试试吗?然后我们会看看你在做什么。

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

∇ Test dummy
    ⎕NQ '#.foo.barButton' 'Select'   ⍝ open window
    :While 0=⎕NC '#.foo.bar.bazTab'
        ⎕DL 1
    :EndWhile
    ⎕NQ '#.foo.bar.bazTab' 'Select'  ⍝ select tab in opened window
    ....
∇

Test& 0

更新 2022-02-18:插入了一个等待显示 window 的循环。