如何创建一个GUI吗

336(30天)
里克
里克 2019年10月4日
编辑: 里克 2021年3月24日
有多种方法来创建一个Matlab的图形用户界面(GUI)。哪种方法是最好的取决于多个因素:项目的复杂性,在多大程度上应该是一个长期的解决方案,在GUI版本应该工作,您的可用时间,你的技术水平,和其他因素可能我已经忘了。
保持线程清楚我将尝试提供一个简短的提纲一些方式这个问题,并且把细节的答案。(@anyone编辑特权:随时更新下面的部分如果我错过了一些重要的编辑这个问题),我慢
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
指南
指南 可能是第一个工具新用户会遇到。是非常有用的很快把东西放在一起,但另有相当有限。它需要维护和分发00和.fig文件。请注意, 指导环境将在未来的版本中被删除。指南是移除后,现有的引导程序将继续运行在Matlab但他们不会编辑指南。 如果你开始一个新的GUI,不要使用指南。如果你更新现有GUI向导, 迁移它 AppDesigner。在R2021a第一步去除拍摄:所有模板除了空白模板已被移除。
内疚
虽然我还没有详细的看自己,似乎这样的列表至少不是完全没有提及 GUI布局工具箱 在文件交换和提供了大量的定制选项。
编程gui
您可以绕过指南和使用正常的数据和功能 uicontrol 从代码构建gui。这使得设计更少的视觉,但为未来增加更灵活。
程序设计师
官方的继任者来指导, AppDesigner 不是基于函数,而是类似于一个类工作。它使用 uifigure 和大多使用图形元素不符合“正常”创建一个gui (或.fig)。
4评论
亚当
亚当 2020年2月10日
有一件事我还没有试过,但是真的需要javacomponent迫在眉睫的死亡,是做一个基于uifigure编程基于类的UI。但这从R2018b希望使这个未来gui的一个可行的办法:
正如上面提到的,我大量使用的GUI工具箱和不愿意创建一个复杂的UI布局没有现在,但uigridlayout的确看起来像一个竞争者取代了使用uifigure,提供Mathworks提供足够我想替换的组件使用基于java的(尤其是一系列滑块,虽然可以工作在一个丑陋的2个滑块的事情)。
毫无疑问我会尝试appdesigner一次又一次,但直到或除非编辑行为一样的主要编码和编辑 整个 UI的代码是可编辑的,这对我来说仍然是行不通的。

登录置评。

答案(3)

里克
里克 2019年10月4日
编程GUI是理想的,如果你需要大量的灵活性和许多超出旧版本的支持。金宝app时更少的视觉设计,但可以减轻通过试验和错误在一个脚本,或者通过使用指南设计最初的布局和获得 位置 适合你的对象。
我的小指南,以避免指南:
  • 图(带f =图;)和调查的医生哪一个属性你想关掉(您可能希望设置菜单工具栏“没有”)
  • 创建按钮和轴和所需的一切功能uicontrol。保存处理每个元素字段的结构(如handles.mybutton = uicontrol (___);)
  • 在函数调用中使用这些处理创建图形对象。从来没有使用gcfgca在代码中,因为用户可能会点击不同的图窗口,进行这些调用目标不正确的。大多数函数允许您指定一个父对象(包括情节,酒吧,和更多)。在创建一个图形对象时,检查文档,看看您可以指定父。
  • 当你完成加载所有数据(和储蓄字段的处理结构),并创建所有的按钮,保存处理的结构guidata你的图是这样的guidata (handles.f处理);。(您也可以使用getappdatasetappdata)
  • 你可以设置回调许多对象的属性。如果你这样做,用一个函数名@前面,或一个字符数组,可以评估有效的代码。(如@MyFunction“disp(“你推按钮”)”)
  • 回调函数将被调用了两个参数:第一个是处理回调对象,第二个是eventdata可能包含特殊的信息。获得您的数据,使用处理= guidata (gcbo);。你可以替换gcbo函数首先输入你的回调函数的名称,如果你喜欢这么说的话。
  • 回调函数的更多信息可以在多个地方找到医生,例如在这里
2的评论
里克
里克 2019年10月7日
你牺牲兼容GNU Octave使用嵌套函数(虽然这可能不是一个问题,我认为是很重要的它被提及)。

登录置评。


亚当Danz
亚当Danz 2019年10月4日
我认为drag-n-drop gui的建设是一个有用的工具,尤其是对于初学者,但是它有局限性,在指导的情况下,偶尔的bug,如果不能正常使用。与drag-n-drop方法,构建一个GUI的自下而上的需要更大的投资时间在开发期间但回报
  • GUI组件的更多控制
  • 简单故障排除
  • 减少开销(我仍然会慌张的GUI初始化运行时期间两次指导GUI启动)
  • 更深层次的背景知识的图形对象及其属性
  • 节省时间在长期通过避免问题否则困难或无法跟踪
即使有初学者的Matlab的经验水平,国际海事组织这些资源下面是足够的开始从自下而上的gui。
  1. 知道UI选项。可以在创建的用户界面图()或者一个uifigure ()。都有一组不同的组件不兼容,他们都有一个不同的外观。
  2. 图()gui交互组件主要是添加使用uicontrol ()列出和他们的属性在这里。列表的一些组件,这些组件可以包含在一个图()GUI在这里大部分时间有有用的示例文档如何实现UI组件,设置其属性,并编写回调函数。首先,“单位”和“位置的属性允许你位置内的组件图。
  3. uifigure ()gui交互组件添加到各自的功能。的列表uifigure ()组件在这里其中包括链接到每个组件的属性。
  4. 了解回调函数。许多UI组件有一个广泛的回调函数所调用的用户交互。在这里是一长串调选项,调用它们的行动,使他们的组件。这链接提供体面的例子如何定义一个回调函数,如何指定输入链接显示回调函数为每个类型的UI组件的例子。
这都归结到熟悉UI组件的列表,他们的属性,和回调函数的选择。这听起来好像很多初学者,但大部分的属性和回调函数的行为相同的组件之间的水平理解应该加速后几成功实现按钮或滑动条等。

里克
里克 2020年1月30日
编辑:里克 2020年1月31日
部分受 亚当的评论 ,我创建了一个类包装一个GUI作为答案 这个问题 。这个例子包含radiobutton, OK按钮(这只关闭图),和一个取消按钮(恢复所有属性回到初始值和关闭图)。这应该陈列柜主的事你可以去做一个基于类的编程GUI。
这风格是编程gui的子集,所以大多数(如果不是全部的话)的建议 我其他的答案 也适用于这里。
classdefMyClass <处理
%就像一个正常的函数,否则医生这里,
%帮助(“MyClass”)将抓住文本的构造函数。
属性%公共属性
Radio_Selected = false;%设置初始值(可选)
结束
属性(访问=私人)%隐藏实现细节
无花果
缺省值=结构;
结束
方法
函数obj = MyClass
% Contructor方法,这将创建GUI
obj.fig =图(“单位”,“归一化”,“位置”,(。3。3。3。3],
菜单条的,“没有”);
%将公共属性的当前值存储为缺省值
道具=属性(obj);
n = 1:元素个数(道具)
obj.defaults。(道具{n}) = obj。(道具{n});
结束
%你可以设置一个私有方法的回调,或者使用一个
%嵌入函数。当然一个char评估也有效。
uicontrol (“单位”,“归一化”,“位置”,(。1。1。35。25],
“字符串”,“好吧”,
“回调”,“关闭(gcbf)”);
uicontrol (“单位”,“归一化”,“位置”,(。55。1。35。25],
“字符串”,“取消”,
“回调”@ (h e) obj.Callback_CANCEL);
uicontrol (“风格”,“radiobutton”,
“单位”,“归一化”,“位置”,(。1。5。8 .4],
“字符串”,“一些单选按钮”,
“回调”@ (h e) Callback_radio (h, obj));
结束
结束
方法(访问=私人)
函数Callback_CANCEL (obj)
%恢复到默认值并关闭图
道具=属性(obj);
n = 1:元素个数(道具)
obj。(道具{n}) = obj.defaults。(道具{n});
结束
关上(obj.fig)
结束
结束
结束
函数Callback_radio (h, class_obj)
%设置类属性,因此它可以检索到GUI后关闭
class_obj.Radio_Selected = h.Value;
结束
2的评论
里克
里克 2020年1月30日
啊,这就是“正确”的方法,我已经编辑我的例子包括作为一个选项。在写/调试我已经知道如何最好的方法设置为回调函数。我怀疑这个语法至少从R2016b工作,因为这是释放你可以把本地函数在脚本,但我自己没有测试的程度。

登录置评。