在创建对象之前定义MatlabGUI默认值

在创建对象之前定义MatlabGUI默认值,matlab,user-interface,matlab-guide,matlab-deployment,appdata,Matlab,User Interface,Matlab Guide,Matlab Deployment,Appdata,我喜欢在创建GUI对象之前定义变量(例如Appdata)。我无法立即在网上找到以下问题: 一般问题1)是什么决定了不同对象创建函数的执行顺序,还是它们都并行运行 一般问题2)对象创建后,OpeningFcn运行。是否有一个函数在创建对象之前运行 具体问题:我的目标是记住GUI的属性值。因此,在更改属性(例如通过回调)并关闭GUI后,它应该在再次启动GUI后记住这些属性。如果是第一次启动GUI,或者如果所有appdata都已重置,则应使用默认值 目前,我为每个单独的\u createFcn(参

我喜欢在创建GUI对象之前定义变量(例如
Appdata
)。我无法立即在网上找到以下问题:

  • 一般问题1)是什么决定了不同对象创建函数的执行顺序,还是它们都并行运行

  • 一般问题2)对象创建后,
    OpeningFcn
    运行。是否有一个函数在创建对象之前运行

  • 具体问题:我的目标是记住GUI的属性值。因此,在更改属性(例如通过回调)并关闭GUI后,它应该在再次启动GUI后记住这些属性。如果是第一次启动GUI,或者如果所有appdata都已重置,则应使用默认值

目前,我为每个单独的
\u createFcn
(参见示例代码)定义了这些属性值(它可以工作),但是对于20多个create函数来说,它非常麻烦。是否可以在创建对象之前定义默认的appdata,这样就不需要太多的if循环?(参见示例代码2)

示例代码1(当前情况):

示例代码2(建议书):


对于您的特定问题,您可以1)在GUI关闭之前将会话数据保存到
.mat
文件中,并在下次启动GUI时加载它,或者2)在GUI关闭之前将会话数据输出到工作区,并在下次启动GUI时将其作为参数传递给GUI函数。下面是一个代码片段,它为一个名为
test
的非常简单的GUI实现了这两个选项,该GUI是通过指南创建的,其中只有一个编辑文本框

function test_OpeningFcn(hObject, eventdata, handles, varargin)
if ~isempty(varargin)
    set(handles.edit1, 'String', varargin{1})
elseif exist('sessiondata.mat','file')
    temp_data = load('sessiondata.mat','output');
    set(handles.edit1, 'String', temp_data.output) 
end
guidata(hObject, handles);
uiwait(handles.figure1);

function varargout = test_OutputFcn(hObject, eventdata, handles) 
output = get(handles.edit1, 'String');
varargout{1} = output;
save('sessiondata.mat', 'output')
delete(handles.figure1);

function figure1_CloseRequestFcn(hObject, eventdata, handles)
uiresume(hObject);
通常,当您单击X按钮关闭GUI时,会调用默认的
CloseRequestFcn
。默认版本只做一件事:杀死GUI。在上面的例子中,我们在
OpeningFcn
中启用
uiwait
,使程序等待用户响应(在这种情况下关闭GUI)。然后在
CloseRequestFcn
中,
uiresume
将GUI定向到
OutputFcn
,然后将数据传递到
varargout
并终止GUI

您可以通过两种方式使用GUI,或者不带参数运行GUI,或者

output = test(input)
如果没有参数,您在编辑文本框中键入的任何内容都将存储在
sessiondata.mat
中,并在下次启动GUI时加载。如果向函数提供参数,它将使用此参数更改编辑文本框中的文本。输出参数将是关闭GUI之前编辑文本框中剩余的任何文本

一般问题1的答案:这主要是我的猜测。我认为这取决于使用GUIDE时创建对象的顺序。此信息存储在
.fig
文件中。我之所以这样猜测,是因为GUIDE显然是在跟踪对象创建,而信息没有存储在
.m
文件中


对一般问题2的回答:
CreateFcn
gui\u mainfcn
的一部分,它被认为是gui创建过程中执行的第一个函数。当
OpeningFcn
在对象创建之后运行时,它会在GUI可供用户交互之前执行,因此您可以在
OpeningFcn
中设置GUI。您还可以尝试更改每个对象的
CreateFcn
,但必须在每个
CreateFcn
中放置代码。因此,我认为
OpeningFcn
将是一个更好的设置GUI的地方

很抱歉我的回复晚了,但谢谢你的反馈!您提到我可以使用.mat文件或工作区来存储GUI会话。但是,这不是问题所在,因为我将所有内容都存储在
appdata(0)
中。我希望在创建对象之前加载此会话的原因是,每个对象
CreateFcn
都使用此信息。您对一般问题的两个回答让我意识到,从
CreateFcn
中删除所有代码并在
打开fcn
期间定义所有内容将更可靠。我需要先弄清楚如何使用
句柄
,然后在这里更新我的工作!除非我弄错了,
appdata
将在关闭GUI后丢失。它用于在GUI处于活动状态时在回调之间共享数据。如果您希望在GUI执行期间生成信息,则需要永久性的方法,例如将数据保存在文件或工作区中的变量中。在我的情况下,只要Matlab本身处于打开状态,
appdata
就会被存储。因此,每次在一天开始时启动Matlab时,它只能使用默认值,这对我来说很好。可能我没有使用appdata,因为它是“应该”使用的。将我所有的(全局)变量存储在其中似乎非常方便。我想您是否也将
appadata
声明为全局变量?我提到的
appdata
是使用
setappdata
方法与
handles
结构一起存储的数据。如果您将这些信息存储为全局变量,那么它当然会在GUI会话之外保持不变,因为它位于全局空间中,而不是GUI工作空间中,而GUI工作空间在每次运行时都会被创建和销毁。我必须提醒您,强烈反对使用全局变量,因为您可以轻松地重写内置函数而不必注意它。我做了一些研究,结果发现
appdata(0)
是Matlab的根工作空间,因此确实是一个全局变量。来源:''。我知道全局变量通常是个坏主意,但我并没有立即看到
appdata(0)
的问题。在Matlab开始时,它实际上是空的,因此不被集成的Matlab代码使用?
function test_OpeningFcn(hObject, eventdata, handles, varargin)
if ~isempty(varargin)
    set(handles.edit1, 'String', varargin{1})
elseif exist('sessiondata.mat','file')
    temp_data = load('sessiondata.mat','output');
    set(handles.edit1, 'String', temp_data.output) 
end
guidata(hObject, handles);
uiwait(handles.figure1);

function varargout = test_OutputFcn(hObject, eventdata, handles) 
output = get(handles.edit1, 'String');
varargout{1} = output;
save('sessiondata.mat', 'output')
delete(handles.figure1);

function figure1_CloseRequestFcn(hObject, eventdata, handles)
uiresume(hObject);
output = test(input)