在代码中进一步使用回调的输出

时间:2013-11-05 17:40:47

标签: matlab

我的代码中有一个子程序,我为用户创建了一个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

2 个答案:

答案 0 :(得分:1)

您应该检查函数getappdatasetappdata和/或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')查询其状态。