管理多个回调

时间:2015-03-03 19:01:34

标签: matlab function user-interface

我创建了一个用户界面,其中包含在循环中创建的许多编辑文本框,现在我想将用户输入存储在带有回调的变量中。

例如,考虑一下这段代码,

function p = myfun()
f = figure;
set(f,'Position',[200 350 250 150],'Color',[.4 .6 .4],'MenuBar','none',...
    'Visible','off');
bc = [.4 .6 .4];
uicontrol('Style','text','Position',[50 80 80 30],...
        'String','X','BackgroundColor',bc,'ForegroundColor','w');
uicontrol('Style','text','Position',[50 40 80 30],...
        'String','Y','BackgroundColor',bc,'ForegroundColor','w');
uicontrol('style','edit','Position', [120 80 80 30],...
    'BackgroundColor',bc,'ForegroundColor','w','Callback',{@My_Callback});
uicontrol('style','edit','Position', [120 40 80 30],...
    'BackgroundColor',bc,'ForegroundColor','w','Callback',{@My_Callback});
uicontrol('Style', 'pushbutton', 'String', 'Ok',...
    'Position', [100 5 60 30],'Callback', 'close'); 
movegui(f,'center')
set(f,'Visible','on')

function My_Callback(hObject,eventdata)
    p = str2double(get(hObject,'string'));
end
end

enter image description here

现在My_Callback将被调用两次,但只有最后一个将被存储在p中。

但我希望将它们存储为p.xp.y

我想我应该使用Tag,它说:

Tag

string (GUIDE sets this property)

User-specified object label. The Tag property provides a means to identify graphics objects with a user-specified label. This is particularly useful when constructing interactive graphics programs that would otherwise need to define object handles as global variables or pass them as arguments between callback routines. You can define Tag as any string.

但我不知道(我有大约16个可编辑的盒子),

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

正如您在评论中提到的那样,您希望在" Ok"之后从编辑框中读取您的值。按下按钮。为此,您应该将回调函数分配给" ok"按钮,而不是编辑框:

uicontrol('Style', 'pushbutton', 'String', 'Ok',...
'Position', [100 5 60 30],'Callback', {@My_Callback});

在回拨功能中,您应该从所有编辑框中读取值。

我建议您在定义编辑框时使用句柄(最好将其用于所有对象):

 e1=uicontrol('style','edit','Position', [120 80 80 30],...
'BackgroundColor',bc,'ForegroundColor','w');
e2=uicontrol('style','edit','Position', [120 40 80 30],...
'BackgroundColor',bc,'ForegroundColor','w');

现在,为了读取值,您只需使用相应编辑框的句柄。

function My_Callback(hObject,eventdata)
    p1 = str2double(get(e1,'string'));
    p2 = str2double(get(e2,'string'));
end

注意:此句柄(e1e2)在您的代码中将具有青色,这意味着它们是全局的"变量,即在主代码和回调函数中使用。

如果您不想使用全局句柄,可以将它们传递给回调函数。所以你的回调函数会有更多的参数。

uicontrol('Style', 'pushbutton', 'String', 'Ok',...
'Position', [100 5 60 30],'Callback', {@My_Callback(e1,e2)});

function My_Callback(hObject,eventdata,e1,e2)
    p1 = str2double(get(e1,'string'));
    p2 = str2double(get(e2,'string'));
end

答案 1 :(得分:2)

如果我正确理解了您的问题,您可以使用UserData uicontrols属性在输入时存储编辑框的内容,这样就可以很容易地在任何地方恢复它们在您的GUI或其他地方。

此外,为方便起见,您可以在创建过程中为uicontrols分配名称,因此当您需要获取其中一个/多个属性时,可以使用其名称而不是hObject参数调用句柄。

例如,假设您使用X数据x1命名该框,然后您可以创建并将其存储在GUI的句柄结构中,如下所示:

handles.x1 = uicontrol(...)

因此,当您需要获取属性时,可以使用

get(handles.x1,'Some Property');

因此,回到您的问题,您可以使用此语法设置UserData内所有框的My_Callback属性。之后,您可以在任何所需的回调中恢复它们。当然,一种简单的方法是获取编辑框的String属性而不是UserData,但使用后者,您可以存储任何您想要的可能方便的内容。

在下面的GUI中,我修改了你们,为名为DisplayData的函数的“确定”按钮更改回调,该函数从每个编辑框中获取UserData并显示它。

function p = myfun()
clear
clc

f = figure;
set(f,'Position',[200 350 250 150],'Color',[.4 .6 .4],'MenuBar','none',...
    'Visible','off');
bc = [.4 .6 .4];
%//===============
uicontrol('Style','text','Position',[50 80 80 30],...
    'String','X','BackgroundColor',bc,'ForegroundColor','w');

uicontrol('Style','text','Position',[50 40 80 30],...
    'String','Y','BackgroundColor',bc,'ForegroundColor','w');
%//===============

handles.x1 = uicontrol('style','edit's,'Position', [120 80 80 30],...
    'BackgroundColor',bc,'ForegroundColor','w','Callback',{@My_Callback});

handles.y1 = uicontrol('style','edit','Position', [120 40 80 30],...
    'BackgroundColor',bc,'ForegroundColor','w','Callback',{@My_Callback});
%//===============
uicontrol('Style', 'pushbutton', 'String', 'Ok',...
    'Position', [100 5 60 30],'Callback', @(s,e) DisplayData);

movegui(f,'center')
set(f,'Visible','on')

guidata(f,handles); %// Updata guidata

    function My_Callback(hObject,eventdata)

        p = str2double(get(hObject,'string'));

        %// Assign the content of the box to its "UserData" property
        set(hObject,'UserData',p)
        guidata(f,handles)
    end

    function DisplayData(~,~)


        %// You could do it for all the boxes in your GUI.
       x1Data = get(handles.x1,'UserData');
       y1Data = get(handles.y1,'UserData');

       fprintf('The number in box 1 is %0.2f and the number in box 2 is %0.2f\n',x1Data,y1Data);

       guidata(f,handles)
    end
end

示例输出:

enter image description here

按下“确定”按钮后,该字符串将显示在命令窗口中:

The number in box 1 is 2.00 and the number in box 2 is 4.00

希望有所帮助!