Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 管理多个回调_Matlab_Function_User Interface - Fatal编程技术网

Matlab 管理多个回调

Matlab 管理多个回调,matlab,function,user-interface,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

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

例如考虑此代码,

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

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

但是我希望它们像
p.x
p.y
那样存储

我想我应该使用
标签
,上面写着:

标签

string(指南设置此属性)

用户指定的对象标签。“标记”属性提供了一种使用用户指定的标签标识图形对象的方法。这在构造交互式图形程序时特别有用,否则,这些程序需要将对象句柄定义为全局变量,或将它们作为回调例程之间的参数传递。您可以将标记定义为任何字符串。

但我不知道怎么做(我有大约16个可编辑框)


谢谢您的帮助。

正如您在评论中提到的,您希望在按下“确定”按钮后从editbox读取值。为此,应将回调函数指定给“确定”按钮,而不是编辑框:

uicontrol('Style', 'pushbutton', 'String', 'Ok',...
'Position', [100 5 60 30],'Callback', {@My_Callback});
在回调函数中,您应该从所有编辑框中读取值

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

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

function My_Callback(hObject,eventdata)
    p1 = str2double(get(e1,'string'));
    p2 = str2double(get(e2,'string'));
end
注意:此句柄(
e1
e2
)将在代码中使用青色,这意味着它们是“全局”变量,即在主代码和回调函数中使用

若不想使用全局句柄,可以将它们传递到回调函数中。因此,回调函数将有更多参数

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

正如您在评论中提到的,您希望在按下“确定”按钮后从editbox读取值。为此,应将回调函数指定给“确定”按钮,而不是编辑框:

uicontrol('Style', 'pushbutton', 'String', 'Ok',...
'Position', [100 5 60 30],'Callback', {@My_Callback});
在回调函数中,您应该从所有编辑框中读取值

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

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

function My_Callback(hObject,eventdata)
    p1 = str2double(get(e1,'string'));
    p2 = str2double(get(e2,'string'));
end
注意:此句柄(
e1
e2
)将在代码中使用青色,这意味着它们是“全局”变量,即在主代码和回调函数中使用

若不想使用全局句柄,可以将它们传递到回调函数中。因此,回调函数将有更多参数

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

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

此外,为了方便操作,您可以在uicontrol的创建过程中为其指定名称,因此当您需要获取其一个/多个属性时,您可以使用其名称而不是
hObject
参数调用句柄

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

handles.x1 = uicontrol(...)
因此,当您需要获取属性时,可以使用

get(handles.x1,'Some Property');
回到您的问题,您可以使用此语法设置
myu Callback
中所有框的
UserData
属性。之后,您可以在任何回调中恢复它们。当然,一个简单的方法是获取编辑框的
字符串
属性,而不是它们的
用户数据
,但是使用后者,您可以存储任何您想要的可能很方便的内容

在下面的GUI中,我修改了您的,以更改名为
DisplayData
的函数的“OK”按钮的回调,该函数从每个编辑框中获取
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
样本输出:

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

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

希望有帮助

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

此外,为了方便操作,您可以在uicontrol的创建过程中为其指定名称,因此当您需要获取其一个/多个属性时,您可以使用其名称而不是
hObject
参数调用句柄

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

handles.x1 = uicontrol(...)
因此,当您需要获取属性时,可以使用

get(handles.x1,'Some Property');
回到您的问题,您可以使用此语法设置
myu Callback
中所有框的
UserData
属性。之后,您可以在任何回调中恢复它们。当然,一个简单的方法是获取编辑框的
字符串
属性,而不是它们的
用户数据
,但是使用后者,您可以存储任何您想要的可能很方便的内容

在下面的GUI中,我修改了您的,以更改名为
DisplayData
的函数的“OK”按钮的回调,该函数从每个编辑框中获取
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
样本输出:

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

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

希望有帮助

您希望在输入值之后,还是在按下“确定”按钮之后,立即从editbox读取值?@MikhailGenkin,在按下
Ok
之后,因为用户可能会更改这些值。谢谢您是想在输入值后立即从编辑框中读取值,还是在按下“确定”按钮后立即从编辑框中读取值?@MikhailGenkin,在
Ok