1

我正在尝试在 matlab 中学习 GUI 编程,为此我正在尝试创建一个简单的乘法计算器。我在 matlab 中做了一些没有 GUI 的程序,但我很难理解 Matlab 中的 GUI 编程。我已经创建了 GUI,但我不知道如何为此进行编程。

这是我制作的 GUI 在此处输入图像描述

EDIT TEXT 1; string= 0
EDIT TEXT 1; tag= edit1
EDIT TEXT 2; string= 0
EDIT TEXT 2; tag= edit2
STATIC TEXT 1; string= X
STATIC TEXT 1; tag= text3
STATIC TEXT 2; string= 0     (for showing results)
STATIC TEXT 2; tag= result
PUSHBUTTON; String= Calculate
PUSHBUTTON; tag=push_calc

我以“add”的名称保存了给定的 GUI 并创建了 add.m 。你能告诉我如何为给定的 gui 进行编程吗?

4

1 回答 1

2

matlab gui编程的基本思想如下:

  1. 设置数字
  2. 进入消息循环

这两个步骤都通过使用 matlab gui 编辑器(指南)来处理。重要的是您将程序流的控制权交给了消息循环。为了完成任务,您可以告诉消息循环在发生任何事情时调用一个函数。

在 gui 编辑器中,右键单击您的按钮并选择“查看回调 -> 回调”。这将在您的 .m 文件中自动创建这样一个函数,您可以在其中指定按下按钮时会发生什么。

为了更好地理解,请查看按钮的回调属性。Guide 将输入类似add('push_calc_Callback',hObject,eventdata,guidata(hObject))调用主函数 (add) 作为新回调函数的包装器的内容。您可以在属性编辑器中自己完成,也可以在启动代码中以编程方式完成。

我想您希望发生以下情况:

  1. 获取edit1和edit2的字符串值
  2. 将字符串转换为数值
  3. 执行计算
  4. 将 text3 的字符串值设置为结果的字符串表示

您可以使用可用的句柄作为第三个函数参数以及 get 和 set 函数来访问 gui 元素的属性。句柄结构由指南创建,元素的名称与您指定的标签相同。

在 matlab 代码中,这可能如下所示:

% --- Executes on button press in push_calc.
function push_calc_Callback(hObject, eventdata, handles)
% hObject    handle to push_calc (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
x_string = get( handles.edit1, 'String');
y_string = get( handles.edit2, 'String');

x_numeric = str2num( x_string );
y_numeric = str2num( y_string );

result_numeric = x_numeric * y_numeric;
result_string = num2str( result_numeric );

set( handles.result, 'String', result_string);

编辑:问题是handles.edit1 等等。每当您想使用按钮或文本框之类的小部件做某事时,您必须能够准确地告诉 matlab 您的意思是什么小部件。指南在幕后做了一些事情。其中之一是调用uicontrol,它创建小部件并返回一个随机但唯一的数字。这有点像银行帐号,因为它是可用于操作它的资源的句柄。当您在指南中创建新按钮并在属性编辑器中分配标签“clickme”时,指南将创建按钮并将句柄存储在结构 handles.clickme中。如果您仍然记得分配给它的标签,那么这为您提供了一种简单的方法来获取您创建的任何小部件的句柄。

让我们看函数的第一行:

x_string = get( handles.edit1, 'String');

只要它与 matlab 与 edit1 小部件关联的数字和属性编辑器中的属性名称(在本例中为“字符串”)相同,就会调用函数get并使用您不应该关心的某个数字。这与您单击所有窗口元素直到属性编辑器显示“edit1”标记并为该对象找到名为“String”的属性的值相同。

每当您输入新文本、移动滑块、更改窗口大小等时,属性都会自动更新。它也可以反过来工作。如果您使用 修改“位置”属性set( handles.edit1, 'Position', [20 20 100 30]),则小部件会自动移动并重新调整大小到指定位置。

于 2012-11-24T14:50:35.780 回答