我的代码中有一个子程序,我为用户创建了一个GUI来选择一种分析:
%% Gives user the choice of replacement method
figure('Units','Normalized','Color','w','Position',[.3 .6 .4 .15],...
'NumberTitle','off','Name','Analysis choice','MenuBar','none');
uicontrol('Style','text','Units','Normalized',...
'Position',[.1 .7 .8 .2],'BackgroundColor','w','String','What replacement method do you want to use?');
uicontrol('Style','pushbutton','Units','Normalized',...
'Position',[.05 .3 .3 .3],'String','Cubic interpolation 24 points',...
'CallBack','cubic_choice'); % cubic_choice.m rotine must be on current folder
uicontrol('Style','pushbutton','Units','Normalized',...
'Position',[.4 .3 .3 .3],'String','Last good data value',...
'CallBack','lgv_choice'); % lgv_choice.m rotine must be on current folder
uicontrol('Style','pushbutton','Units','Normalized',...
'Position',[.75 .3 .2 .3],'String','Linear interpolation',...
'CallBack','li_choice'); % li_choice.m rotine must be on current folder
uiwait;
close;
此外,在代码中,我有一个if循环来分析用户的选择:
if strcmp(inp,'cubic') ...
问题是,当我按下“Cubic interpolation 24 points”按钮时,回调函数不会给我inp
变量,即它不会出现在工作区上。
回调函数是这样的:
%% Callback script for replacement method
% Cubic interpolation with 24 points method
function [inp] = cubic_choice
inp = 'cubic';
uiresume(gcbf); % resumes the button call
我知道我可能不得不使用setappdata和getappdata,因为我已经在其他一些帖子中读过它,但是我无法让它工作。
任何人都可以帮助我吗?
提前致谢。
亲切的问候, Pedro Sanches
答案 0 :(得分:1)
您应该检查函数getappdata
,setappdata
和/或guidata
,而不是使用全局变量。
基本上,从您的回调中,您必须在某个地方设置您的选择,您可以在其余代码中访问它。
一种可能性是使用set/getappdata
如下:
function cubic_choice()
figHandle = ancestor(gcbf, 'figure');
setappdata(figHandle, 'choice', 'cubic');
uiresume(gcbf);
end
在uiwait
来电之后,您可以获取此属性,从您的数字调用的返回值中取figHandle
在您示例的第一行:
inp = getappdata(figHandle, 'choice');
答案 1 :(得分:0)
这是一个可变范围和设计的问题。在回调函数之外将不会显示inp
。您也没有“将其返回到工作区”,因为它是回叫您的GUI;工作区中没有任何分配。
您可以在回调函数中的工作区和中声明global inp
,如
function [inp] = cubic_choice
global inp
inp = 'cubic';
但是,您可能需要考虑直接从回调处理程序中响应选择。这意味着,无论您的if
语句中的代码是什么,都可以直接进入您的回调函数。
或者,如果它真的是关于选择,为什么不使用单选按钮?然后,您可以继续处理由h
返回的uicontrol
并在以后使用get(h, 'value')
查询其状态。