MATLAB的图形用户界面创建工具GUIDE真的像我想象的那么糟糕吗?有没有替代品?

18

我一直在尝试在MATLAB中创建一个GUI,但却遇到了很大的困难。以下是有关我的程序的一些背景信息:我想创建一个向导程序来引导用户完成图像分析过程。该向导程序将提示用户输入,并在按下标为“下一步”的按钮后执行图像处理操作,依此类推。从阅读MATLAB帮助文档中,我认为有两种方法可以创建GUI:1.编写包含行的代码的GUI;2.使用GUIDE。

我认为使用GUIDE会有最浅的学习曲线。起初,这个过程很简单。我可以轻松地拖放按钮和文本框并进行排列。我的计划是安排一系列面板,其中包含按钮、文本等,并在按下“下一步”按钮时顺序变得可见,但是我卡在这里了。

一旦我使用GUIDE保存面板,MATLAB将创建一个.m文件和.fig文件。通过阅读.m文件,我看到它留下了空间让我编写回调函数的代码,但其他方面都很少。.fig文件是二进制的,因此我不敢去编辑它。我想知道如何控制对象,例如如何设置面板的可见性。此外,我必须单独创建向导的每个面板。我希望能够手动将.m文件组合成一个wizard.m包装文件,但我认为这不是正确的方法(至少对我而言,因为我看不到如何做到这一点)。

除了使用GUIDE之外,我还看到了使用“uicontrol”函数创建GUI的示例。这种方法对我来说似乎很繁琐,因为我需要手动编写每个按钮的位置、大小和默认值。也许这是最好的方法,但它让我感到害怕。

因此,我对MATLAB的GUI工具感到不满,并因为无法克服这个障碍而对自己感到不满。

我曾经看到一些在MATLAB中创建的华丽图形用户界面,尝试过后发现自己做得远远不够好,也因此对它们的存在感到困惑。要么是那些制作人员是非常出色的MATLAB用户(而我并不是),要么是我忽略了一些显而易见的东西,需要帮助才能理解。我现在开始怀疑一个图形用户界面是否值得这样的努力。我不太可能尝试像QT这样的东西,因为将MATLAB代码嵌入到其他语言(如Python)中会带来额外的挑战。

有没有人能给我关于这个问题的建议?请问有没有人能指出我哪里做错了或者为什么我遇到了这样的困难?


4
我使用 GUIDE 来进行可视化的图形用户界面设计,然后通过 uicontrol() 进行编程。我参考 GUIDE 的属性来确定如何定位元素。目前这种方法对我来说很有效,尽管有些繁琐。 - Dang Khoa
6个回答

20

.fig文件是二进制文件,因此我不敢编辑它。

FIG文件是MAT文件,其中包含您在GUIDE中设置的属性列表和GUI元素。

如何设置面板的可见性?

为元素分配一个标签,您可以使用handles.mytag访问它,例如set(handles.mypanel, 'visible', 'off')

此外,我必须单独创建向导的每个面板。我希望能够手动将.m文件合并到wizard.m包装器文件中,但我认为这不是正确的方法(至少对我来说是这样,因为我不知道如何做到这一点)。

您不能将这些自动生成的m文件自动合并为一个,为什么要这样做呢?为每个向导页面保留.fig和.m文件!

没有使用GUIDE的情况下,我看到过使用“uicontrol”函数创建GUI的示例。这种方法对我来说似乎很繁琐,因为我需要手动编写每个按钮的位置、大小和默认值。也许这是最好的方法,但它让我感到害怕。

直接使用uicontrol并不是不好,如果您不手动定位元素而使用布局管理器。您可以在这里这里看到一些。如果您希望GUI能够很好地自适应大小,则布局管理器是唯一的方法。

有人对此有建议吗? 请问有谁可以指出我做错了什么或为什么我会遇到如此困难?

专业的GUI编程并不容易,在我看来甚至是最困难的部分。

除了MATLAB GUI之外,我还经常使用Java Swing和.NET WPF,我认为MATLAB GUI要简单得多,您可以用10%的(学习)努力做到90%。当然,您仍需要时间来适应它。

因此,我对MATLAB的GUI工具感到不满意,因为它似乎很笨拙,并且我对自己没有克服这个障碍的实力感到不满意。

是的,GUIDE不是最好的解决方案,但可能是快速创建GUI的最佳技术。

我见过一些在MATLAB中创建的花哨的GUI,并尝试过自己创建,但远远不够,我对它们的存在感到困惑。

这些GUI是利用MATLAB GUI的特定细节的黑客,例如视觉分隔符是一个长的“__________”黑色文本,位于仅有两个像素高的白色uicontrol中,或者使用HTML在工具提示中使用不同的颜色。

在MATLAB GUI中,您可以使用Java Swing(因为它实际上是从Swing派生的)

我现在在质疑是否值得花费精力来做GUI。

是的,在您的情况下,保持非常简单,只需功能,不要考虑花哨的东西!


1
对于一个详尽且有帮助的回答,点赞! - Jonas

6

截至2015年6月,GUIDE比你想象的更糟糕。它在配置GUI方面效率极低,而且非常容易出错。绝对不是专业级别的。GUIDE,我是多么鄙视你啊!让我来列举一下:

1)创建GUI时不会标记输入错误。这种未经通知的错误可能潜伏很久,你可能要花费数小时才能发现。当你点击“保存”时,GUIDE不会保存你的工作。因此,GUIDE违反了任何软件包的首要指令:不要丢失用户的工作或数据。我简直无法相信Mathworks竟然发布了这样糟糕的东西。

2)复制粘贴有问题。假设你有一个计算早餐影响的程序。你有可编辑的小时、分钟和碳水化合物数量框。你有静态文本标签。你希望午餐和晚餐也有同样的内容。全选。Ctrl-C。将光标指向其他地方,然后按Ctrl-V。什么都没有发生。不,等等,大约30秒后,粘贴出现了。但如果你已经在做其他事情,那么……试着弄清楚到底发生了什么。

3)即使是批量移动也很神奇/奇怪/超自然/被附身的。比如你想把午餐的那一行上下移动?高亮。使用箭头键移动它。成功了!但等等!大约五秒钟后,文本和编辑框开始回到原来的位置!没有人为干预!它被附身了!

我用GUIDE创建了一个相当复杂的GUI。比它应该或可能的要麻烦得多。考虑到有免费的替代品可以运行JAVA/Python/Julia,我不会开始另一个需要GUI的MATLAB项目。省点钱吧!


2
我正想问与 OP 相同的问题,试图证明我在编写 GUIDE 时所遇到的痛苦。我正在使用 R2015a,并且认为所有 GUIDE 开发的痛苦日子现在都已经解决了。它确实取得了很大进展,但用户体验很差。像你说的那样,在尝试复制多个元素时会出现错误,我经常发现自己不得不查看对象浏览器,以确保没有东西从我身后悄悄溜走。保存和对象对齐无响应,这是一种痛苦的体验。>< - jxramos
2
当执行多个选择“对齐对象”命令时,我看到与第2点相同的行为,这让我感到非常烦恼并浪费了大量时间。如果这不是Matlab的官方GUI创建工具,我早就放弃它了。实际上,我正在尝试将一个人善意但不灵活的程序生成的GUI分离出演示和业务逻辑,以便重用业务逻辑,但如果这种情况再拖延一天,我可能会放弃并在脚本中解决他的布局问题,而不是经历GUIDE的痛苦。 - jxramos
2
这里有更多的奇怪行为!所以当你进行“冗长”的操作时,实际上会调用等待光标,但它只在菜单和工具栏上可见,而不是在 GUIDE 的设计工作区上。现在我已经养成了习惯,如果事情变得无响应,就在“可通信区域”移动我的光标并等待完成。希望这能解决我所有的挫败感。 - jxramos

4

个人而言,我认为GUIDE在快速创建简单GUI和学习如何创建GUI方面已经足够好了,但现在我通常更喜欢通过编程方式创建GUI。这样可以更好地控制内容。对我来说,关键是使用UI元素的UserData属性存储任何有用的数据,包括要更新的UI对象的句柄。

但如果你想要一些聪明的东西,那么你将不得不求助于基于Java或.NET的东西。

此外,重要的是要记住MATLAB最擅长的领域,GUI并不是它的强项。如果你使用一个GUI创建更好的编程语言,那么你将不得不在其他方面做出妥协,比如处理数组和矩阵数据的易用性。

编辑:@Mikhail链接的GUI布局工具箱看起来非常有用。


2
已经过了几年,现在我已经熟练掌握了MATLAB GUIDE的使用。回想起来,我觉得这样回答最合适。GUI不是MATLAB的强项,但对于快速简单的GUI来说很方便。 - wherestheforce

3

我一直在用MATLAB编写GUI程序。

从我的经验来看,使用GUIDE可以使编写GUI变得非常方便。正如你所说,实际上你不必费心编写任何按钮等内容,只需排列按钮并填写M文件即可。在按钮中,您可以通过将属性“Visible”设置为“on”或“off”来处理可见性。

我尝试了两种方法:手动编写GUI和使用GUIDE编写GUI。我有这样的印象,你真的只需要进入其中。一旦你掌握了句柄的概念(这是MATLAB GUI的主要内容),你就掌握了它。

首先尝试编写一个简单的GUI,不要从你的项目开始。掌握MATLAB中的句柄和检查器以及如何设置属性值。找出在GUI中可以存储数据的位置以及如何在其他窗口中检索它(在窗口之间传递句柄)。

我想这就是全部!在MATLAB中编写GUI可能很难开始,但一旦你掌握了我上面提到的东西,它就变得非常简单明了。


3
GUIDE生成的GUI与编程创建的GUI相比,主要问题在于文件不是文本。因此,您不能使用版本控制。有一个解决方法 - 您可以使用导出功能仅创建.m文件。当然,您将无法将其切换回fig并进行可视化编辑。
就个人而言,我总是更喜欢不使用GUIDE编写GUI。

可以在版本控制系统中使用它,但无法正确合并更改。 - zmbq
2
@zmbq,每当您在指南中单击按钮以查看其回调时,它实际上会更改图形。这很糟糕,因为您没有进行任何更改,但可能会将其提交为新版本。 - Andrey Rubshtein

0

我来晚了,但想要补充我的看法。正如你所提到的,GUI设计不是MatLab的强项,但是它仍然可以做很多事情。如果你有任何具体问题,我很乐意回答。此外,请注意它是建立在Java Swing库上的,因此你实际上可以利用那些功能。然而,这些功能并没有记录在案。有一本书叫做《MatLab未公开秘密》,其中提供了对底层Swing组件的相当不错的讨论。

MatLab GUI有一些怪癖,但如果你能克服它们,你会喜欢它的。此外,正如之前提到的,其中一个更困难的障碍是handles的概念。一旦你掌握了这个概念,你就已经完成了90%的工作。


凭借足够的努力和创造力,我们可以建造一座通往月球的塔。虽然泡泡糖可能会显著改变我们对地球轨道的某些预期,但这至少是可想象的。但这并不是到达月球的好方法。 - KDN
我有一个问题:如何进行锚定? - Pedro77
好吧,除了泡泡糖是为了嚼而不是送人上月球而创造的。GUIDE是用于创建GUI的。 - physics90

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接