如何模拟从脚本中单击 questdlg 中的按钮
How can I simulate clicking a button in a questdlg from a script
我目前正在编写测试例程来检查 Matlab (R2014a) 程序的图形前端计算出与脚本版本相同的结果(两者都依赖于相同的底层方法)。
到目前为止,我通常使用以下模式来查找 window 和按钮的句柄并执行适当的回调:
handleWindow = findall(0, 'Tag', figureName);
handleButton = findobj(handleWindow, 'Tag', buttonName);
callbackButton = get(handleButton, 'Callback');
callbackButton(handleWindow, []);
这适用于所有使用 GUIDE 创建的自写图形。但是,我 运行 在尝试自动回答问题对话框 (questdlg
) 时遇到了麻烦。
uiwait
阻止进一步执行我的测试脚本这一事实可以很容易地通过使用计时器异步执行命令直到对话框关闭来规避。这已经适用于 CloseRequestFcn
.
我的问题是 questdlg
中的按钮不存在真正的回调函数,而是调用 uiresume(gcbf)
。直接调用 uiresume(handleQdlg)
不会关闭对话框。
您是否知道如何模拟点击这些按钮,或者您是否知道任何更优雅的方式来模拟整体点击按钮?
事实证明,我已经走上了正确的轨道。我的计时器的延迟太短了。看来我在 window 尚未等待时尝试恢复它。延迟更长的时间它会起作用。
这是我最终使用的函数:
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
我目前正在编写测试例程来检查 Matlab (R2014a) 程序的图形前端计算出与脚本版本相同的结果(两者都依赖于相同的底层方法)。
到目前为止,我通常使用以下模式来查找 window 和按钮的句柄并执行适当的回调:
handleWindow = findall(0, 'Tag', figureName);
handleButton = findobj(handleWindow, 'Tag', buttonName);
callbackButton = get(handleButton, 'Callback');
callbackButton(handleWindow, []);
这适用于所有使用 GUIDE 创建的自写图形。但是,我 运行 在尝试自动回答问题对话框 (questdlg
) 时遇到了麻烦。
uiwait
阻止进一步执行我的测试脚本这一事实可以很容易地通过使用计时器异步执行命令直到对话框关闭来规避。这已经适用于 CloseRequestFcn
.
我的问题是 questdlg
中的按钮不存在真正的回调函数,而是调用 uiresume(gcbf)
。直接调用 uiresume(handleQdlg)
不会关闭对话框。
您是否知道如何模拟点击这些按钮,或者您是否知道任何更优雅的方式来模拟整体点击按钮?
事实证明,我已经走上了正确的轨道。我的计时器的延迟太短了。看来我在 window 尚未等待时尝试恢复它。延迟更长的时间它会起作用。
这是我最终使用的函数:
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