如何在 MATLAB GUI 中的函数之间传递值?
Posted
技术标签:
【中文标题】如何在 MATLAB GUI 中的函数之间传递值?【英文标题】:how to pass value among functions in MATLAB GUI? 【发布时间】:2012-04-12 18:17:56 【问题描述】:我正在尝试将图像文件转换为二进制文件,我在 Matlab GUI 中使用了 2 个按钮。 第一个按钮用于浏览文件,然后在静态文本上显示文件名,第二个按钮用于将其保存为 CSV 文件,这是我的代码
function varargout = signatureGUI(varargin)
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @signatureGUI_OpeningFcn, ...
'gui_OutputFcn', @signatureGUI_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin1)
gui_State.gui_Callback = str2func(varargin1);
end
if nargout
[varargout1:nargout] = gui_mainfcn(gui_State, varargin:);
else
gui_mainfcn(gui_State, varargin:);
end
% End initialization code - DO NOT EDIT
% --- Executes just before signatureGUI is made visible.
function signatureGUI_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
handles.filename = 0;
guidata(hObject, handles);
% --- Outputs from this function are returned to the command line.
function varargout = signatureGUI_OutputFcn(hObject, eventdata, handles)
varargout1 = handles.output;
% --- Executes on button press in browsefile.
function browsefile_Callback(hObject, eventdata, handles)
filename = uigetfile('*.jpg'; '*.jpeg'; '*.png');
handles.filename=filename;
guidata(hObject, handles);
set(handles.showfile, 'String',filename );
% --- Executes on button press in buttonwritecsv.
function buttonwritecsv_Callback(hObject, eventdata, handles)
handles.filename;
new = imread (filename);
newrgb=rgb2gray(new);
newrgb_io = binz(newrgb);
[filecsv,pathcsv] = uiputfile('*.csv','Save CSV File');
csvwrite([filecsv,pathcsv], newrgb_io);
guidata(hObject, handles);
我正在尝试使用“handles.filename”让“另存为”按钮能够从“浏览”按钮获取变量,但是当我在浏览文件后单击“另存为”按钮时,它什么也不做。 ..
我是否遗漏了什么或在使用时犯了错误?
按照@Richante 的回答后,我收到了以下错误,我不明白
??? Reference to non-existent field 'output'.
Error in ==> signatureGUI>signatureGUI_OutputFcn at 34
varargout1 = handles.output;
Error in ==> gui_mainfcn at 265
feval(gui_State.gui_OutputFcn, gui_hFigure, [],
gui_Handles);
Error in ==> signatureGUI at 17
gui_mainfcn(gui_State, varargin:);
我不知道它是什么..
【问题讨论】:
【参考方案1】:是的,这不太对。不要使用handles
来存储数据 - 使用您自己的结构。在OpeningFcn
:
myData.filename = [];
guidata(hObject, myData);
那么当你想检索这些数据时(例如browsefile_Callback
):
...
myData = guidata(hObject);
myData.filename = uigetfile(...);
set(handles.showfile, 'String', filename);
和buttonwritecsv_Callback
:
myData = guidata(hObject);
new = imread(myData.filename);
...
基本上,guidata(hObject, myData)
可让您存储 myData
,myData = guidata(hObject, myData)
可让您检索它。
【讨论】:
好的@Richante,感谢您的建议,但我仍然遇到一些错误,我会发布它 我认为这个答案是正确的。我相信您确实想使用句柄结构。 MATLAB 文档指出,“GUIDE 使用 guidata 来存储和维护句柄结构。在 GUIDE GUI 代码文件中,不要覆盖句柄结构,否则您的 GUI 将不再工作。如果您需要存储句柄以外的数据以用于在您的 GUI 中,您可以向句柄结构添加新字段并将数据安全地放置在那里。”以上是关于如何在 MATLAB GUI 中的函数之间传递值?的主要内容,如果未能解决你的问题,请参考以下文章