最近在 用matlab做一個GUI的用戶界面 大多都是百度出來 摸索的學習 總結一下遇到的一些問題和解決方法
一:
在文本框動態顯示文本 (保留之前的文本並顯示當前文本內容):
在文本框顯示文本 基本的語法是
set(handles.listbox2,'String',string);
<1>想要保留之前文本內容 用過網上提供的代碼 textwrap函數
(但是 當從 str =get(handles.listbox2,'String'); 得到的str放到string{}里面 textwrap會提示錯誤 ....orz 錯誤提示忘記截圖了)
figure('units','normalized','position',[0.4 0.4 0.4 0.3]); h = uicontrol('Style','Text','fontsize',16); string = {'靜態文本框為什么是靜態的?','因為不能像編輯框一樣滾動顯示其中的內容','如果想在靜態文本框中多行顯示','按照這種方式就可以實現','調用textwrap函數啊!'}; [outstring,newpos] = textwrap(h,string); set(h,'String',outstring,'Position',newpos);
<2>后來也想過更新txt 然后將txt內容顯示在文本框呢 遇到的問題是 從txt文檔一行一行讀字符串 顯示在文本框的字符是在一整行的 (;′⌒`)
<3> 下面是常用的方法 (百度好久查到的 )
這個方式邏輯上是沒有什么的 也沒有語法錯誤 但是 我遇到了至今未解決的問題 :理想情況 ->程序邊運行邊在文本框顯示文本內容
現實情況—> 不能實時顯示文本內容 要等到程序運行玩才能全部顯示出來 更新速度太慢 不知道這種情況能不能改進
ss = get(handles.listbox2,'String'); str =sprintf('XXXXXX'); ss{end+1}=str; set(handles.listbox2,'String',ss);
二:matlab 按鈕之間的參數傳遞
<1> 第一種方式的傳遞參數 更適合多個GUI之間的傳遞 如果是單個GUI傳遞 會面臨一個 txt文本保留了之前的數據或覆蓋之前的數據(比如你可能會多次使用一個數據)
setappdata(0,'A',A) A=getappdata(0,'A').
<2>第二種方式 會遇到未知的錯誤 比如 我使用的時候 它很奇怪的並沒有實現參數傳遞
handles.in1 = varargin{1}; handles.in2 = varargin{2}; guidata(hObject, handles); %保存
<3> 第三種方式 是我認為最簡單的 也是我經常使用的一種方式 但是但是,簡單的問題就在於有時你會很頭疼!因為在每一個要到該全局變量的地方,你都要添一句gloal x,還有就是如果你在一個地方修改了x的值,那么所有x的值就都變了!有的時候恐怕會出現紊亂。另一個更重要的問題在於,套用C++的一句話,全局變量破壞了程序的封裝性!所以,全局變量是能少用盡量少用。 (碰巧我的程序里面 不需要修改他們值 只是簡單的使用)
<4>還有其他的一些方式 參見 http://blog.sina.com.cn/s/blog_6163bdeb0100i2j4.html
三:顯示程序運行的時間
tic; /..../ %代碼 toc; sprintf(‘%s’,num2str(toc)); %顯示的程序運行的時間
timer類定時器(之后應該還會寫一篇它的實時處理數據,目前還沒有研究通)
t=timer('TimerFcn',{@timercallback,handles},'ExecutionMode', 'fixedRate', 'Period', 0.01); start(t);
四:matlab kmeans 函數注意的地方
當要聚類的數據只有一組向量是.....
[idx1,c1,sumD1,D1] = kmeans(T,1);
c1 是個1*1的數 orz 還有就是 默認的距離是 平方歐式距離 (⊙﹏⊙)b 坑了我好久 ><!!
五:GUI對話框設計(復制 方便看)
from: http://heatflow.blog.163.com/blog/static/193360279201172191146666/
dialog 創建對話框
errordlg 創建錯誤對話框
helpdlg 創建幫助對話框
inputdlg 創建輸入對話框
listdlg 創建選擇列表對話框
msgbox 創建消息對話框
pagedlg 顯示頁面的版面對話框
printdlg 顯示打印對話框
questdlg 問題對話框
uigetfile 文件檢索對話框
uiputfile 為寫入而顯示的檢索對話框
uisetcolor 從對話框交互式設置對象的ColorSpec
uisetfont 交互設置對象字體特征
warndlg 警告對話框
*對話框設計:在圖形用戶界面程序設計中,對話框是重要的信息顯示和獲取輸入數據的用戶界面對象。
1、公共對話框:
公共對話框是利用windows資源的對話框,包括文件打開、文件保存、顏色設置、字體設置、打印設置等。
1) 文件打開對話框:用於打開文件
uigetfile
uigetfile(‘FilterSpec’)
uigetfile(‘FilterSpec’,’DialogTitle’)
uigetfile(‘FilterSpec’,’DialogTitle’,x,y)
[fname,pname]=uigetfile(…)
2) 文件保存對話框:用於保存文件
uiputfile
uiputfile(‘InitFile’)
uiputfile(‘InitFile’,’DialogTitle’)
uiputfile(‘InitFile’,’DialogTitle’,x,y)
[fname,pname]=uiputfile(…)
3) 顏色設置對話框:用於圖形對象顏色的交互設置
c=uisetcolor(‘h_or_c,’DialogTitle’)
4) 字體設置對話框:用於字體屬性的交互式設置
uisetfont
uisetfont(h)
uisetfont(S)
uisetfont(h,’DialogTitle’)
uisetfont(S,’DialogTitle’)
S=uisetfont(…)
5)打印設置對話框:用於打印頁面的交互式設置
dlg=pagesetupdlg(fig)
pagedlg
pagedlg(fig)
6) 打印預覽對話框:用於對打印頁面進行預覽
printpreview
printpreview(f)
7) 打印對話框:
printdlg
printdlg(fig)
printdlg(‘-crossplatform’,fig)
printdlg(-‘setup’,fig)
2、MATLAB專用對話框
1)錯誤信息對話框:用於提示錯誤信息
errordlg 打開默認的錯誤信息對話框
errordlg(‘errorstring’) 打開顯示’errorstring’信息的錯誤信息對話框
errordlg(‘errorstring’,’dlgname’) 打開顯示’errorstring’信息的錯誤信息對話框,對話框的標題由‘dlgname’指定
erordlg(‘errorstring’,’dlgname’,’on’) 打開顯示’errorstring’信息的錯誤信息對話框,對話框的標題由‘dlgname’指定. 如果對話框已存在,’on’參數將對話框顯示在最前端。
h=errodlg(…) 返回對話框句柄
例:errordlg('輸入錯誤,請重新輸入','錯誤信息')
2) 幫助對話框:用於幫助提示信息
helpdlg 打開默認的幫助對話框
helpdlg(‘helpstring’) 打開顯示’errorstring’信息的幫助對話框,
helpdlg(‘helpstring’,’dlgname’) 打開顯示’errorstring’信息的幫助對話框, 對話框的標題由‘dlgname’指定
h=helpdlg(…) 返回對話框句柄
例:helpdlg('矩陣尺寸必須相等','在線幫助')
3) 輸入對話框:用於輸入信息
answer=inputdlg(prompt) 打開輸入對話框,prompt為單元數組,用於定義輸入數據窗口的個數和顯示提示信息,answer為用於存儲輸入數據的單元數組。
answer=inputdlg(prompt,title) 與上者相同,title確定對話框的標題。
answer=inputdlg(prompt,title,lineNo) 參數lineNo可以是標量、列矢量或m×2階矩陣,若為標量,表示每個輸入窗口的行數均為lineNo;若為列矢量,則每個輸入窗口的行數由列矢量 lineNo的每個元素確定;若為矩陣,每個元素對應一個輸入窗口,每行的第一列為輸入窗口的行數,第二列為輸入窗口的寬度。
answer=inputdlg(prompt,title,lineNo,defAns) 參數defans為一個單元數組,存儲每個輸入數據的默認值,元素個數必須與prompt 所定義的輸入窗口數相同,所有元素必須是字符串。
answer=inputdlg(prompt,title,lineNo,defAns,Sesize) 參數resize決定輸入對話框的大小能否被調整,可選值為on或off.
例:prompt={'Input Name','Input Age'};
title='Input Name and Age';
lines=[2 1]';
def={'John Smith','35'};
answer=inputdlg(prompt,title,lines,def);
4) 列表選擇對話框:用於在多個選項中選擇需要的值
[selection,ok]=listdlg(‘Liststring’,S,…) 輸出參數selection為一個矢量,存儲所選擇的列表項的索引號,
輸入參數為可選項’Liststring’(單元數組), ’SelectionMode’(’single’或’multiple’, ’ListSize’([wight,height]), ’Name’ (對話框標題)等
5) 信息提示對話框:用於顯示提示信息
msgbox(message) 打開信息提示對話框,顯示message信息。
msgbox(message,title) title確定對話框標題。
msgbox(message,title,’icon’) icon用於顯示圖標,可選圖標包括:none(無圖標)/error/help/warn/custom(用戶定義)
msgbox(message,title,’custom’,icondata,iconcmap) 當使用用戶定義圖標時,icondata為定義圖標的圖像數據,iconcmap為圖像的色彩圖。
msgbox(…,’creatmode’) 選擇模式creatmode,選項為:modal, non_modal, 和replace。
h=msgbox(…) 返回對話框句柄
6) 問題提示對話框:用於回答問題的多種選擇
button=questdlg(‘qstring’) 打開問題提示對話框,有三個按鈕,分別為:yes,no和cancel,’questdlg’確定提示信息。
button=questdlg(‘qstring’,’title’) title確定對話框標題。
button=questdlg(‘qstring’’title’,’default’) 當按回車鍵時,返回default值default 必須是yes,no或cancel 之一。
button=questdlg(‘qstring’,’title’,’str1’,’str2’,’default’) 打開問題提示對話框,有兩個按鈕,分別由str1和str2確定,’qstdlg’確定提示信息,default必須是str1或str2之一。
button=questdlg(‘qstring’, ’title’,’str1’,’str2’,’str3’,’default’) 打開問題提示對話框,有三個按鈕,分別由str1, str2和str3確定,’qstdlg’確定提示信息,default必須是str1, str2或str3之一。
7) 進程條:以圖形方式顯示運算或處理的進程
h=waitbar(x,’title’) 顯示以title為標題的進程條,x為進程條的比例長度,其值必須在0到1之間,h為返回的進程條對象的句柄。
waitbar(x,’title’,’creatcancelbtn’,’button_callback’) 在進程條上使用creatcancelbtn參數創建一個撤銷按鈕,在進程中按下撤銷按鈕將調用button_callback函數。
waitbar(…,property_name,property_value,…) 選擇其它由prompt_name定義的參數,參數值由prompt_value指定。
例:
h=waitbar(0,'pleas wait...');
for i=1:10000
waitbar(i/10000,h)
end
close(h)
MATALB的標准圖形用戶界面
1. 消息對話框
msgbox函數。它不接受用戶的任何輸入,在用戶單擊OK按鈕后,對話框自動關閉,然后返回程序中繼續執行。
>> msgbox('歡迎使用MATLAB') % 建立一個沒有標題的消息對話框
>> msgbox('歡迎使用MATLAB','MATALB','warn') %% 建立一個有標題的消息對話框
2. 錯誤對話框
errordlg函數。 >> errordlg %建立一個默認參數的錯誤對話框
>> errordlg('這是一個錯誤對話框','MATLAB error') %建立一個名為MATLAB error的錯誤對話框
3. 警告對話框
warndlg函數。 >> warndlg %建立一個默認參數的警告對話框
>> warndlg('這是一個警告對話框','MATLAB warning')
4. 幫助對話框
helpdlg函數。
>> helpdlg('你需要幫助嗎?','MATLAB Help')
5. 進度條設置對話框
waitbar函數。作用是反映程序運行的完成情況。
h=waitbar(0,'請稍等......')
for i=1:10000
waitbar(i/10000)
end
6.輸入對話框
inputdlg函數。
prompt={'輸入梯形的上底:','輸入梯形的下底','輸入梯形的高'};%設置提示字符串
name='Enter trapeaia Data';%設置標題
numlines=1;%指定輸入數據的行數
defAns={'20','50','40'};%設定默認值
Resize='on';%設定對話框尺寸可調節
answer=inputdlg(prompt,name,numlines,defAns,'on')%創建輸入對話框
7. 列表對話框
listdlg函數。
p=path(path,'C:\MATLAB7\work');%設置路徑,若為當前目錄,可以省略這一步
d=dir('C:\MATLAB7\work');%獲取指針,若為當前目錄,則d=dir
str={d.name};%獲取目錄內的文件名
[sel,ok]=listdlg('Liststring',str,'PromptString','請選擇文件','SelectionMode','Multiple')%創建列表對話框。
文件選擇成功后,單擊“OK‘按鈕,系統將選擇好的文件序號存入相應向量sel,參數ok的值為1。
8.問題對話框
questdlg函數。提出一個問題,等待用戶回答。默認下回答按鈕有三個:Yes、No、Cancel。當用戶單擊任何一個按鈕時,系統將該按鈕名保存在一個變量(ButtonName)中。如果用戶關閉對話框,則系統將ButtonName置為空。
>> ButtonName=questdlg('你准備好了嗎?','MATLAB quest','Yes','No','Cancel','Yes')
9.路徑選擇對話框
uigedir函數。用於用戶查找和選擇路徑。
>> directoryname=uigetdir('C:\MATLAB7\work','瀏覽文件件')
10.選擇文件對話框
uigetfile函數。用於用戶選擇所需的文件。
① >> [fn,pn,fi]=uigetfile('*.m','select a M-file')%打開一個選擇M文件的對話框,並選擇一個文件
② [fn,pn,fi]=uigetfile(...
{'*.m;*.fig;*.mat;','All MATLAB File(*.m,*.fig,*.mat,*.mdl)';
'*.m','M-file(*.m)';...
'*.fig','Figure(*.fig)';...
'*.mat','MAT-flie(*.mat)';...
'*.mdl','Models(*.mdl)';...
'*.*','All Flies(*.*)'},...
'Pick a file')
%打開一個選擇多種文件的對話框,並選擇一個文件
11.文件保存對話框
uiputfile函數。用於保存文件。
① >> [fn,pn,fi]=uiputfile('*.m','Save selected a M-file')
② [fn,pn,fi]=uiputfile(...
{'*.m;*.fig;*.mat;','All MATLAB File(*.m,*.fig,*.mat,*.mdl)';
'*.m','M-file(*.m)';...
'*.fig','Figure(*.fig)';...
'*.mat','MAT-flie(*.mat)';...
'*.mdl','Models(*.mdl)';...
'*.*','All Flies(*.*)'},...
'Save a file')
%建立多種保存文件的對話框,並選擇一個文件
12.頁面設置對話框
pagesetupdlg函數。用來設置頁面的各種屬性、參數。調用格式為:
dlg=pagesetupdlg(fig)
該命令創建一個頁面設置對話框,在該對話框用戶可以設置頁面的各種屬性和參數。該命令只支持單一圖形窗口的頁面設置,參數fig也必須是單一的圖形句柄,不可以是圖形句柄向量或simulink圖。
>> fig=figure;
>> dlg=pagesetupdlg(fig)
13.打印設置對話框
printdlg函數。用戶可以對各種打印參數進行設置。
x=[-pi:0.02:pi];
y=cos(x);
fig=figure;
plot(x,y);
printdlg(fig);%打開Windows打印對話框
printdlg('-crossplatform',fig);%打開MATLAB打印對話框
14.顏色設置對話框
uisetcolor函數。用於用戶設置圖形的前景色或背景色。
① >> c=uisetcolor %建立一個顏色選擇對話框
② %建立一個顏色對話框,並設置對話框的初始顏色,然后選擇一種顏色用於一個圖形對象。
x=[0:0.02:2*pi];
y=sin(x);
h=figure;
plot(x,y);
c=uisetcolor(h,'select color')
15.字體設置對話框
uisetfont函數。用於用戶設置或修改文本字體、坐標軸或設置控件對象的顯示文本的字體屬性。
① >> s=uisetfont % 建立一個默認字體設置對話框,並設置一種字體。
② 對控件中的文本進行設置
T1=uicontrol('style','pushbutton','string','確定',...
'position',[200 320 60 20]); %創建一個按鈕
T2=uicontrol('style','pushbutton','string','取消',...
'position',[200 220 60 20]); %創建一個按鈕
s=uisetfont(T1) %打開字體設置對話框
set(T2,s) %將T1的設置復制到