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 datax1
命名框,然后您可以创建它并将其存储在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 datax1
命名框,然后您可以创建它并将其存储在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