旗幟鮮明地反對從GUIDE入門Matlab GUI。

使用GUIDE做GUI的最大也是唯一的優點便是直觀、低門檻,代價卻是沉重的——對於一個大型的界面系統,後期如要修改,將會是天大的工作量。

GUIDE的門檻確實很低,上手很快,但是同樣,它的上限也很低。對於一個有點基礎和追求的同學,我都不建議學習GUIDE製作Matlab GUI。好的習慣要從一開始培養,不要給自己設限。

在這篇回答裏,我將以一個例子分享我做GUI的一個套路。文末更新了界面代碼文件,有愛自取。

先上幾個作品:

大家都用matlab做過哪些有趣的事兒??

www.zhihu.com圖標

在一個界面系統下,每一個.m腳本文件對應一個界面。我們以上圖中極簡風格的【線性擬合】的代碼講解基本構成:

【0】初始化

clc;close all;clear all;

【2】創建界面

global hF_start
hF_start=figure(menubar,none,Resize,off,NumberTitle,off,position,...
[100,200,1200,700],name,線性擬合,Visible,on);

【3】聲明全局變數

這個等到最後確定需要傳遞的變數後再統一聲明

global xx

【4】控制項參數設置

在這一環節,主要將要設置的控制項按照區域劃分成不同的數組,之所以按照區域劃分,主要標準是在設置位置的時候有規律可循(比如x/y相同),有規律,就可以用循環。

ui_text_1 ={溫度(℃),壓強(atm),線吸收強度};
unit =*1e-24cm/molecule;
edit_text1 ={30,0.0845526,8.273};
ui_text_20 ={初始值,計算值};
ui_text_2 ={q,z,碰撞偏移 d,碰撞展寬 g,FD多普勒,α,ξ,β,b af(x)+b,a af(x)+b};
edit_text_2_1={6,0.01,0,0,0.5,2,0,0,0,1};
edit_text_2_2={,,,,,,,,,};
ui_text_3 ={氣體分壓,氣體濃度,計算耗時};
unit_text_3 ={atm,ppm,s};
Text_CallBack={原始數據,計算,結果導出,清除};
Fun_CallBack ={Input0,calculate,Output0,Clearaxes};

我在這裡只設置了文本,如果在草稿上確定佈局,還可以把坐標設置好。

【5】控制項設置

然後就開始循環設置控制項了。以下是我對ui_text2的控制項設置:

for i=1:length(ui_text_2)
if i&>0 i&<=4 ui_2(i)=uicontrol(gcf,style,push,string,振動點,ForegroundColor,bb,value,0,fontsize,15,position,[230+l 240+(i-1)*60+d 80 30],visible,on); edit21(i)=uicontrol(gcf,style,edit,fontname,Times New Roman,BackgroundColor,aa,string,100,value,0,ForegroundColor,bb,fontsize,12,position,[310+l 240+(i-1)*60+d 50 30],visible,on); edit22(i)=uicontrol(gcf,style,edit,fontname,Times New Roman,BackgroundColor,aa,string,100,value,0,ForegroundColor,bb,fontsize,12,position,[310+50+l 240+(i-1)*60+d 50 30],visible,on); elseif i&>4 i&<=8 ui_2(i)=uicontrol(gcf,style,push,string,振動點,ForegroundColor,bb,value,0,fontsize,15,position,[430+l 240+(i-1-4)*60+d 80 30],visible,on); edit21(i)=uicontrol(gcf,style,edit,fontname,Times New Roman,BackgroundColor,aa,string,100,value,0,ForegroundColor,bb,fontsize,12,position,[510+l 240+(i-1-4)*60+d 50 30],visible,on); edit22(i)=uicontrol(gcf,style,edit,fontname,Times New Roman,BackgroundColor,aa,string,100,value,0,ForegroundColor,bb,fontsize,12,position,[510+50+l 240+(i-1-4)*60+d 50 30],visible,on); else ui_2(i)=uicontrol(gcf,style,push,string,振動點,ForegroundColor,bb,value,0,fontsize,15,position,[630+l 240+(i-1-8)*60+d 80 30],visible,on); edit21(i)=uicontrol(gcf,style,edit,fontname,Times New Roman,BackgroundColor,aa,string,100,value,0,ForegroundColor,bb,fontsize,12,position,[710+l 240+(i-1-8)*60+d 50 30],visible,on); edit22(i)=uicontrol(gcf,style,edit,fontname,Times New Roman,BackgroundColor,aa,string,100,value,0,ForegroundColor,bb,fontsize,12,position,[710+50+l 240+(i-1-8)*60+d 50 30],visible,on); end set(ui_2(i),string,ui_text_2{i}) set(ui_2(i),style,text); set(ui_2(i),BackgroundColor,Bcolor); %set(edit21(i),fontsize,15) set(edit21(i),string,edit_text_2_1{i}); set(edit22(i),string,edit_text_2_2{i}); end

以上就是一個界面的基本設置,而對於回調函數,細心的同學應該看到了,我在【4】中設置了兩行Text_CallBack和Fun_CallBack,對應的就是功能鍵的名字和相應回調函數的名字。然後回調函數,直接就在Input0.m,calculate.m裡面寫。這就是大家很熟悉的基本的Matlab功能編寫了。

最後,提醒一下:除了主界面,其他所有腳本(包括子界面和功能函數),都不要在開頭初始化。

我曾不止一次地跟我的同學朋友強調過這樣一個觀點:網上的信息魚龍混雜,要學會分辨。很多教程只是一些新手剛剛學會便迫不及待想要分享喜悅而帶來的不成熟的經驗,或許並沒有錯,但是會走很多彎路,也會限制你的視野。

我想,當你熟練掌握GUIDE的時候,大抵也沒有動力去學慣用腳本寫GUI了。這不能不說是一種遺憾吧。

我在15年由於參加的項目的需要開始學習GUI,我很慶幸我的GUI入門是一本叫做《Matlab GUI學習手記》的相對專業的書籍,作者以高屋建瓴的方式帶我一睹了Matlab GUI的大概,這讓我一開始就接觸了用腳本控制界面的方法,從而少走了很多彎路。

我覺得Matlab GUI,這一本書就足夠了。

Main.m8.2K · 百度網盤


馬上要畢業了,曾經也花費了大量的功夫和時間去研究這個GUI,在知乎,微信公眾號,CSDN等等,這裡分享一下自己的一點心得,另外,這個網站是個學習matlab的好地方

【原創】利用GUI實現excel文件和table控制項的互操作 - MATLAB中文論壇?

www.ilovematlab.cn圖標

當你真正學會的時候,其實就很簡單了,我是因為導師的要求,需要將我所有的學習課題資料統統匯總到一個界面裡邊,GUI是一個非常好的東西,點一下,這個程序便可以運行,我是學電動汽車的鋰離子電池BMS的一小塊內容,狀態預測這方面的東西,這個是我設計的OCV-SOC擬合的一個GUI,

OCV-SOC擬合界面設計

註:

1.MATLAB自帶的工具箱,」cftool「也是可以很好的做這個事情的,言歸正傳,接下來講講如何去設計這個GUI。

2.我所用版本為MATLAB2016b


第一步,先創建一個GUI界面

MATLAB界面輸入,」guide「,然後創建一個GUI,這裡有兩部分,一個是figure一個是code文件,code是一堆代碼,那麼我們很難通過代碼去控制界面,老手是可以做到的,我們新手小白先簡單的去做這個事情,就是在figure中去設計,這裡說一下GUI中非常關鍵的一個東西,Tag

雙擊figure中的按鈕,找tag這個標籤

你要你的程序所出的圖,表,如何對應到固定的axes和列表呢,就是這個標籤,打個比方,我要把東西給小明,但你不能給小紅,所以你要把程序寫入這個叫」小明「的組件中去,這樣就對應起來了,GUI說到底就是一個程序的啟動器

所有的功能,左邊的按鈕基本上已經涵蓋了,我只講一些我常用的按鈕

1.按鈕

程序運行後,這個單擊,就是一個程序的啟動。在figure界面,雙擊,就是這個按鈕的編輯了,比如顏色,背景色,線寬等等,也可以更Tag,更改標籤,換一個我們需要的名字。然後我們需要做的就是去關聯一段程序

右鍵點擊按鈕,callback
callback之後會自動進入這個按鈕程序代碼

2.按鈕組

這個是單選按鈕與面板的組合,按鈕的對齊可以用自動對齊
多個單選按鈕組成一個組,針對組,就需要用這個作為一種回調

按鈕組的作用就是可以實現不同的選擇,比如不同路況的試驗數據,不同溫度

3.顯示

我的數據要展示,圖要顯示,那麼怎麼在GUI中顯示呢,就是以下兩個按鈕

這個是出圖的顯示界面
表的顯示界面

4.下拉菜單

同樣是選擇不同的項目

點擊這個中間按鈕增加下拉菜單的項目

好嘞,以上的功能適合大部分簡單的GUI設計了,其他的錦上添花的東西,諸君自行琢磨,比如加個開機動畫,加個進度條,數據保存到EXCEL,另外多一嘴,MATLAB可以實現與office的互通,我可以用代碼將excel的數據導入matlab

兩個函數

xlsread,這個函數可以實現excel導入matlab

xlswrite,這個函數實現MTALB數據自動寫入excel


註:想在GUI中玩的精,關注一下這個大牛」打浦橋程序員

1.這裡上傳一下我在那裡下載的一個資料,感興趣的,自行下載哦~

MATLAB GUI電子書.pdf1M · 百度網盤

2.我在學習GUI中收集的一些網站

MATLAB中的單選按鈕和按鈕組_matlab_永不言棄-CSDN博客?

blog.csdn.net圖標https://www.ilovematlab.cn/thread-120650-1-1.html?

www.ilovematlab.cn

https://www.ilovematlab.cn/thread-21726-1-1.html?

www.ilovematlab.cn

MATLAB GUI表格(uitable)的增刪操作?

blog.csdn.net圖標MATLAB編寫GUI小結--動態更改GUI佈局、多個面板交替顯示_matlab_long_xuan123的博客-CSDN博客?

blog.csdn.net圖標

MATLAB設計GUI界面非常簡單

1.進入界面設計環境

打開MATLAB,然後再 主頁——新建——圖形用戶界面,選擇一個空的GUI界面即可

2.進入編輯界面,拖入各種控制項,開始設計界面

3. 按鈕callback

設置按鈕屬性,保存,在保存的*.m文件中寫入執行的代碼,即完成了按鈕的callback


如果是Matlab GUI設計的初學者,強烈建議閱讀《MATLAB GUI設計學習手記(第三版)》。

有需要這本書和書中示例代碼的同學可以聯繫我,或者從下方鏈接下載:

MATLAB GUI學習祕籍下載?

eyun.baidu.com


剛開始接觸gui就是從matlab和python這來的。學py的時候有一個地方是用用個包做gui,雖然又出了很多包,但都感覺很弱(最近不知道咋樣了),無意間發現了matlab做gui太容易了,一度沉迷於此,以下列出優劣勢:

優勢:遇到科學計算方面的實現信手拈來

劣勢:生成獨立的exe文件體積太誇張的大了,很不方便。對於在含有matlab的機器上運行還好些,可以縮減很多體積,但貌似也有版本等問題,即我寫的gui代碼拿到另一個機器會報小錯。

本來我就不太需要gui這個功能,所以沒多久就棄坑了,雖然腦海里產生了一些好玩的想法。

最近又想撿gui起來了,因為瞭解了C#,初學發現和matlab gui有些像,但更穩定,有vs加成,遇到科學計算的部分,也有成熟的庫調用。


更新:

對於c#在科學計算方面的缺陷,可以通過.net平臺上的類numpy包彌補。我做了個小東西,有點感受:

隨機老化:numSharp+winform製作模擬布朗運動的GUI?

zhuanlan.zhihu.com圖標

大些的gui也木問題,生成的exe很小,在win下方便傳播。我覺得我找到了最好的解決方案。目前就是對於.net下的類numpy、matplotlib、pandas及眾ML包的documents很不完整,但這都是假以時日的事。


一種是在command窗口下輸入guide,會彈出引導界面,以拖拽的方式圖形化開發界面,簡單快捷,重點在於學習如何編寫callback以及如何使用handles結構體;還有一種是使用m文件,手擼界面,比較繁瑣,個人覺得這種方式相對自由一些,重點在於callback函數編寫。

ps:相關資料網上有很多,還有不少視頻教程


為什麼會刷到這個 可能是最近查MATLAB太多了吧

這個問題有點日子了,現在好像用APP Designer更多,GUI的話,沒有APP Designer那麼方便簡單


matlab gui基於java swing,可以在腳本里寫簡單的java或者打包好.jar給matlab調用。自帶的gui組件基本就是matlab腳本包著java swing,可以看看undocumentedmatlab,解鎖隱藏功能哦。還有一個半官方的layout toolbox也不錯,方便複雜界面佈局,也可作為自己寫界面的參考。當然matlab真不適合做重gui的東西,大多數人就guide拖拖控制項吧。以前不得不用matlab手寫複雜界面,相當噁心....


做gui用MATLAB可是真糟糕,拖控制項的VB、c#的winform又簡單又香。本就是個腳本語言,效率低,還要拿來做界面,真尷尬。


多線程下支持不好,花了半個月全部轉到了python。qt可以很好的替代matlab app designer,相同操作邏輯。


推薦閱讀:
相關文章