Matlab 如何模拟从脚本单击questdlg中的按钮
我目前正在编写测试例程,以检查Matlab(R2014a)程序的图形前端计算的结果是否与脚本版本相同(两者都依赖于相同的底层方法) 到目前为止,我通常使用以下模式查找窗口和按钮的句柄并执行相应的回调:Matlab 如何模拟从脚本单击questdlg中的按钮,matlab,user-interface,dialog,automation,Matlab,User Interface,Dialog,Automation,我目前正在编写测试例程,以检查Matlab(R2014a)程序的图形前端计算的结果是否与脚本版本相同(两者都依赖于相同的底层方法) 到目前为止,我通常使用以下模式查找窗口和按钮的句柄并执行相应的回调: handleWindow = findall(0, 'Tag', figureName); handleButton = findobj(handleWindow, 'Tag', buttonName); callbackButton = get(handleButton, 'Callback')
handleWindow = findall(0, 'Tag', figureName);
handleButton = findobj(handleWindow, 'Tag', buttonName);
callbackButton = get(handleButton, 'Callback');
callbackButton(handleWindow, []);
这适用于使用GUIDE创建的所有自写图形。但是,我在尝试自动回答问题对话框时遇到了麻烦(questdlg
)
uiwait
阻止进一步执行我的testscript,这一事实可以通过使用计时器异步执行命令,直到对话框关闭。这对于CloseRequestFcn
来说已经很好了
我的问题是,questdlg
中的按钮没有真正的回调函数,而是调用uiresume(gcbf)
。直接调用uiresume(handleQdlg)
不会关闭对话框
你知道如何模拟点击这些按钮吗?或者你知道有什么更优雅的方法来模拟整体点击按钮吗?因为事实证明我已经走上了正确的道路。我的计时器的延迟时间太短了。好像我在窗口还没等的时候就试着重新打开了。它工作的延迟时间更长 以下是我最终使用的函数:
function answerQuestDlg(obj, titleStr, index)
%answerQuestDlg(obj, titleStr, index)
% Find the question dialog with specified title and simulate
% clicking the button with the appropriate index.
% If index is not 1, 2 or 3, simuluate pressing the X.
allRootWindows = allchild(0);
hQuestDlg = findobj(allRootWindows, 'Tag', titleStr);
switch (index)
case 1
hButton = findobj(hQuestDlg, 'Tag', 'Btn1');
case 2
hButton = findobj(hQuestDlg, 'Tag', 'Btn2');
case 3
hButton = findobj(hQuestDlg, 'Tag', 'Btn3');
otherwise
callbackClose = get(hQuestDlg, 'CloseRequestFcn');
callbackClose();
return
end
set(hQuestDlg, 'CurrentObject', hButton);
callbackButton = get(hButton, 'Callback');
if ischar(callbackButton)
callbackStr = strrep(callbackButton, 'gcbf', 'hQuestDlg');
eval(callbackStr);
else
callbackButton();
end
end
只是一个想法:在代码开头设置一个“脚本标志”会不会太麻烦,如果从脚本运行程序,您会设置为
true
;然后,在这种情况下,您可以使用swtich/case
语句模拟quesdlg
的答案,对话框将“关闭”?@Benoit_11如果我尝试不使用全局变量(我真的不想在最终版本中使用这些变量),那么这将非常麻烦。我想最简单的方法是使用另一个函数重载questdlg
,该函数决定是调用内置的questdlg还是使用易于访问的方法调用伪函数来更改其输出。但在所有情况下,最好只使用自制对话框。我仍然不需要根据测试调整“有效负载”。是的,我同意,我想为问题对话框构建一个简单的GUI将为您节省很多麻烦!我还建议您为此构建自己的小型gui,这就是我在gui工具箱中所做的。您需要小心查找对象的方法,并管理测试是否找到超过1个句柄。例如,@matlabgui我同意,我需要小心处理这些事情。但是,由于我不打算在成品中使用这些窗口(仅在应在干净环境中启动的测试脚本中使用),例如,具有此标题的多个窗口将指示这些脚本中较早出现的问题,无论如何都应予以修复。