在 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" 它。
我在我的机器上完成了以下操作:
'⎕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 的循环。
我正在尝试为 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" 它。
我在我的机器上完成了以下操作:
'⎕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 的循环。