【问题标题】:Global variables set in GUI with no values - Matlab在 GUI 中设置的全局变量没有值 - Matlab
【发布时间】:2013-07-30 20:12:48
【问题描述】:

我创建了一个 GUI 来设置参数并在另一个 m 文件中使用这些参数。我知道在 GUI 中创建的变量与输入变量到 m 文件位于不同的工作区中。出于这个原因,我尝试使用global variables,但没有成功:变量进入 m-File 为空。

我有一个带有 3 个编辑框的 GUI,用户可以使用此代码设置参数(0 或 1)(仅显示一个编辑框的代码):

function density_Callback(hObject, eventdata, handles)
% hObject    handle to density (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of density as text
%        str2double(get(hObject,'String')) returns contents of density as a double
global density
density = str2double(get(hObject, 'String'));
global Variavel_1
assignin('base', 'Variavel_1', density);

m 文件从 GUI 按钮调用,使用以下代码:

function calculate_Callback(hObject, eventdata, handles)
% hObject    handle to calculate (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

test %m-File that uses variables set in GUI

并且 m-File 应该使用这个 Variavel_1 和此代码 (test.m) 中剩余编辑框中的其他文件:

global Variavel_1
global Variavel_2
global sum    

Variavel_1
Variavel_2
sum = Variavel_1 + Variavel_2

但我所拥有的只是所有这些变量都是空的! (我知道我可以将此代码放在 GUI 代码中,但这不是真正的建议,因为这个简单的 m-File 求和会复杂得多,所以我需要将变量转到 m-File)。

Variavel_1 = []

Variavel_2 = []

Sum = []

谁能理解为什么全局变量会失败?

提前致谢!

【问题讨论】:

    标签: matlab user-interface global-variables


    【解决方案1】:

    在自动生成的OpeningFcn 回调中,如果您使用的是 GUIDE 您可以在handle 结构中定义变量/字段。

    这是初始化部分。它使用的数据可以在 GUI 上的所有小部件之间共享。

    因此,在此回调中,对于variable_1variable_2sum 等,您可以有如下内容:

    handles.variable_1 = 1;
    handles.variable_1 = 2;
    handles.sum = handles.variable_1 + handles.variable_1 = 1;
    
    % At end update handles structure
    handles.output = hObject;
    guidata(hObject, handles);
    

    在其他回调中,说出您的 ButtonEdit 回调

    您可以正常更新这些值,如下所示

    handles.variable_1 = 12;
    handles.variable_1 = 23;
    handles.sum = handles.variable_1 + handles.variable_1 = 1;
    
    % Now, at end of callback save the change you made to the structure
    guidata(hObject,handles)
    

    要验证这些值,请在命令窗口中输入 handles

    Ref :Store or retrieve GUI data 了解更多详情。

    要将这些变量从 GUI 使用到其他脚本,只需在工作区中分配它们 像assignin('base','variable_1',handles.variable_1); 等在variable_1 正在更新的任何回调中。

    然后,在您的 m 脚本中,您可以直接使用这些变量。

    【讨论】:

    • 感谢您的回复。我知道我可以在 GUI 代码中定义 sum 表达式,但这不是真正的提议。我很抱歉没有说清楚。我必须将这些变量传递给 m-File,因为 m-File 会比这复杂得多。
    • @Luiz 哪个m-file ?除了 GUI 本身的 m-file 吗? GUI代码,callbacks将在m-file中,其设计将保存在.fig文件中,除了GUIDE生成的m-file之外,您是否自己创建了其他m-file
    • 是的,m-File 是我程序中名为“test”的文件,它是对变量求和的文件。所以,GUI 按钮调用这个“test.m”,如上所示!
    • 对不起,我的错误。我已经在使用assignin(),只是忘了将该行复制到问题中。但我用的是不同的方式,所以,我会尝试这种方式,让你知道。
    • 刚刚测试得到相同的结果,变量被创建,但是他们无法通过m-File访问值,导致一个空值
    【解决方案2】:

    我认为您可以将test 函数(保存在“test.m”中)定义为:

    function sum = test(x, y)
    sum = x + y;
    

    然后使用您的calculate_CallBack 函数调用您的test 函数:

    sum = test(Variavel_1, Variavel_2);
    

    诚然,我并不精通 MATLAB 中的 GUI 编程,因此可能有一些非常明显的原因您不能这样做,但这避免了使用全局变量,这通常会使代码更简洁。

    【讨论】:

      猜你喜欢
      • 2013-05-06
      • 2010-10-31
      • 1970-01-01
      • 2021-06-21
      • 2014-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多