1. 程式人生 > >今天搞畢設了麼——4.22(matlab GUI)

今天搞畢設了麼——4.22(matlab GUI)

第一部分:

1、從最簡單的開始

程式設計的基本思想是:我執行一個操作,程式做出一個反應。“一個操作”包括點選滑鼠、拖動滑塊、填寫資料、選擇選項等;“做出一個反應”包括計算、儲存在哪裡、貼個圖出來、顯示在哪裡。
 簡言之:當點選按鈕A時,然後執行任務C,則進入按鈕A的回撥函式callback裡,寫下任務C的程式碼。
幾個基本概念:    
CallBack: 最常用的。點選按鈕時,按鈕下的Callback就會執行;拖動滑塊時,滑塊名下的callback就會執行;總之,正常用途全放在callback下。
ButtonDownFcn:單擊,這個函式名下的程式碼就會執行。(ps:按鈕的callback也是點選,覆蓋掉buttondownfcn。)
CreateFcn:顧名思義,在生成這個控制元件,顯示之前,執行這個函式名下的程式碼。
DeleteFcn: 顧名思義,在控制元件要銷燬,但是被毀滅之前執行這個函式名下的程式碼。貌似“真的要退出嗎”這一類。
KeyPressFcn:當前控制元件獲得焦點且有按鍵按下時執行。
SelectionChangeFcn:在群按鈕元件中改變選擇時,所執行的函式。
       
2、常用控制元件程式碼框架參考
Toggle Button 的callback一般寫法
functon  togglebutton1_callback(hObject,eventdata,handles)
%這一句不用管。自動加的。 
button_state = get(hObject,'Value') 
%控制元件甲的callback下面hObject就是控制元件甲,同理控制元件乙callback下的hObject......
if button_state==get(hObject,'Max')
   %則……
else ifbutton_state==get(hObject,'Min')
    %則……
end
PS:button_state是變數名,存放按鈕的選擇狀態。如果button甲放在一個buttonGroup裡,則button甲callback下的程式碼就要挪到buttonGroup下面去。因為buttonGroup的回撥函式會覆蓋掉它成員的回撥函式。
RadioButtons 
右鍵Radio按鈕,進入編輯callback
function ………………略
if(get(hObject,'Value')==get(hObject,'Max'))
   %被選中了,你想怎麼樣
else
   %不被選中,你想怎麼樣
end
Check Boxes
if(get(hObject,'Value')==get(hObject,'Max'))
   %被選中了,你想怎麼樣
else
   %不被選中,你想怎麼樣
end
EditText
function edit1_Callback(hObject,eventdata,handles)
user_string =get(hObject,'String');   %就得到了所輸入的字元
%matlab把所有輸入當作字元,如果期望輸入資料,則進行資料型別轉換:
user_entry=str2double(get(hObject,'String'));    
ifisnan(user_entry)        %nan就是not a number的簡寫。
    errodlg('You must entry a number value','BadInput','modal')     %跳出一個對話方塊。
end
PS: 'Bad Input'是指視窗樣式,如黃色感嘆號或者紅叉的對話方塊;modal是指視窗型別,如警告對話方塊。
Sliders
function slider1_callback(hObject,eventdata,handles)
slide_value=get(hObject,'Value');%獲取滑塊當前值
%別的程式碼
PS:它的Max Min 屬性設定了滑竿的最大最小範圍值。
ListBoxes
function ........
index = get(handles.listbox1,'Value'); %listbox1控制元件的tag名
file_list=get(handles.listbox1,'String');  %得到了listBoxes的列表
file_name = file_list{index};%得到了所選擇的專案名
%別的程式碼
PS:此callback在滑鼠在這個控制元件上鬆開或者特定的鍵盤按鍵鬆開(看怎麼設定屬性)時執行。預設鍵盤上下鍵可以改變它的值同時執行一次callback。而enter和space不改變它的值,只是執行callback。Max-Min差值是0的話,表示只可以單選;1的話,表示可以多選。這個可以在他的屬性欄裡設定。
Pop_up Menus
function .......
val=get(hObject,'Value')
Switch val
case 1
%
case 2
%
defualt
......
end
Button Groups
function .......
switch get(hObject,'Tag');%注意這裡的hObject和別的不同,不是指ButtonGroup,而是指在組裡面被選中的那個控制元件
case 'radio button1'  %按鈕1的tag
    %。。。。。
case '按鈕2的tag'
    %。。。。。
end
Axes
axes(handles.youraxesname);%選擇一個axes
plot(x,y); %這時所畫的圖就到它上面了
set(handles.youraxesname,'XMimrFrick','on'); %順便設定一下它的屬性
grid on; %加上網格
 
3、怎麼獲得和設定控制元件的屬性
通俗的說,就是怎麼獲取編輯框裡的字元、滑塊現在的位置、popup裡被選中的選項,如何控制static text顯示我要求的資訊等。
設定:set(handles.控制元件的tag,'要設定的屬性名','要設定的屬性值')。比如:set(handles.edit1,'string','helloworld');
獲取:get(handles.控制元件的tag,'要獲取的屬性名')
help裡可以看到所有可能有用的屬性:MATLAB->CreatingGraphical User Interfaces->Laying Out GUIs andSetting Properties->What Properties Do I Need toSet?


4.資料怎麼在不同的控制元件之間傳遞
先看在一個GUI介面內部的傳遞資料。每一個控制元件的回撥函式頭:function myc_Callback(hObject,eventdata, handles)
第一個引數是hObject,是跟這個callback所關聯的控制元件的handles,在它自己的callback下,可以用代號->hObject 來呼叫它。即控制元件自己的回撥函式呼叫自己的屬性,只用hObject.屬性名就可以了(中間一點)。
第二個引數是MATLAB的保留引數。
第三個handles是這個GUI介面的代號,可以通過它獲取這個介面的所有資訊。所以在控制元件A自己的回撥函式中,要獲取或者設定別的控制元件的屬性,就用handles.別的控制元件Tag.屬性  
 handles hObject都是結構體。handles格式是一個存放資料的缸。控制元件的handles是小缸,它的名字叫做hObject;GUI介面的handle是一個大缸,並且這個缸名字也叫做handles;大缸裡存放了所有的小缸和所有使用者資料,你只需handles.控制元件A的tag,就可以存取控制元件A的資訊。
把自己計算出或者別的什麼資料放到這個缸裡,可以在任何地方:   
handles.變數名 =某些值    (其實也就是給結構體新增成員變數)
b=handles.變數名    (結構名加點號來引用成員變數)
就可以得到這個變數值,同樣也可以修改它。
別忘了使用guidata(hObject,handles);在函式末尾來儲存你對handles和hObject的操作。(不然你自定義的變數就沒了)
 
5、在不同GUI之間傳遞資料
傳入:   
先看開啟一個GUI介面時,傳給他的引數有哪些。
 function mygui_OpeningFcn(hObject, eventdata,handles, varargin)
 所有的啟動引數都是通過varargin傳到它的OpeningFcn裡面的。啟動引數包括:
 figure,也就是視窗引數,如position之類。例如:開啟這個GUI時,使用命令mygui('Position',[434234 234 34])表示開啟視窗在這個位置;還有哪些可控屬性可以查help。
自定義引數,如果傳入的引數不是figure的屬性(matlab查詢不到你輸入的屬性名),則輸入的引數作為一個向量存放在varargin裡面。比如mygui('路人甲','80‘),那varargin{1}存放了'路人甲',varargin{2}=’80‘
傳出:
看每一個GUI的最外層的那句 function varargout =mygui(varargin)。把GUI本身看做一個函式,b=mygui(一些傳入的引數)  就執行GUI並返回結果,b就得到了傳出來的結果。
在GUI任意地方,將要輸出的資料存在handles.output裡面。
handles.output=資料1;
handles.secend_output=資料2;
然後在GUI的outputFcn裡面加上
varaginout{1}=handles.output;
varaginout{2}=handles.secend_output;

這樣就把資料傳出來了。


第二部分:

命令列視窗輸入deploytool,敲回車,選擇第一個。

新增檔案,並填寫相關的資訊,之後就是打包就ok啦 

第三部分:

是個例項:(具體自己搞好了,就把程式碼放這算了)


 
  function varargout = jiemiantu(varargin)
 
 
  % JIEMIANTU M-file for jiemiantu.fig
 
 
  % JIEMIANTU, by itself, creates a new JIEMIANTU or raises the existing
 
 
  % singleton*.
 
 
  %
 
 
  % H = JIEMIANTU returns the handle to a new JIEMIANTU or the handle to
 
 
  % the existing singleton*.
 
 
  %
 
 
  % JIEMIANTU('CALLBACK',hObject,eventData,handles,...) calls the local
 
 
  % function named CALLBACK in JIEMIANTU.M with the given input arguments.
 
 
  %
 
 
  % JIEMIANTU('Property','Value',...) creates a new JIEMIANTU or raises the
 
 
  % existing singleton*. Starting from the left, property value pairs are
 
 
  % applied to the GUI before jiemiantu_OpeningFcn gets called. An
 
 
  % unrecognized property name or invalid value makes property application
 
 
  % stop. All inputs are passed to jiemiantu_OpeningFcn via varargin.
 
 
  %
 
 
  % *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one
 
 
  % instance to run (singleton)".
 
 
  %
 
 
  % See also: GUIDE, GUIDATA, GUIHANDLES
 
  
 
 
  % Edit the above text to modify the response to help jiemiantu
 
  
 
 
  % Last Modified by GUIDE v2.5 22-Apr-2016 09:46:12
 
  
 
 
  % Begin initialization code - DO NOT EDIT
 
 
  gui_Singleton = 1;
 
 
  gui_State = struct('gui_Name', mfilename, ...
 
 
   'gui_Singleton', gui_Singleton, ...
 
 
   'gui_OpeningFcn', @jiemiantu_OpeningFcn, ...
 
 
   'gui_OutputFcn', @jiemiantu_OutputFcn, ...
 
 
   'gui_LayoutFcn', [] , ...
 
 
   'gui_Callback', []);
 
 
  if nargin && ischar(varargin{1})
 
 
   gui_State.gui_Callback = str2func(varargin{1});
 
 
  end
 
  
 
 
  if nargout
 
 
   [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
 
 
  else
 
 
   gui_mainfcn(gui_State, varargin{:});
 
 
  end
 
 
  % End initialization code - DO NOT EDIT
 
  
 
  
 
 
  % --- Executes just before jiemiantu is made visible.
 
 
  function jiemiantu_OpeningFcn(hObject, eventdata, handles, varargin)
 
 
  % This function has no output args, see OutputFcn.
 
 
  % hObject handle to figure
 
 
  % eventdata reserved - to be defined in a future version of MATLAB
 
 
  % handles structure with handles and user data (see GUIDATA)
 
 
  % varargin command line arguments to jiemiantu (see VARARGIN)
 
  
 
 
  % Choose default command line output for jiemiantu
 
 
  handles.output = hObject;
 
  
 
 
  % Update handles structure
 
 
  guidata(hObject, handles);
 
  
 
 
  % UIWAIT makes jiemiantu wait for user response (see UIRESUME)
 
 
  % uiwait(handles.figure1);
 
  
 
  
 
 
  % --- Outputs from this function are returned to the command line.
 
 
  function varargout = jiemiantu_OutputFcn(hObject, eventdata, handles) 
 
 
  % varargout cell array for returning output args (see VARARGOUT);
 
 
  % hObject handle to figure
 
 
  % eventdata reserved - to be defined in a future version of MATLAB
 
 
  % handles structure with handles and user data (see GUIDATA)
 
  
 
 
  % Get default command line output from handles structure
 
 
  varargout{1} = handles.output;
 
  
 
  
 
 
  % --- Executes on button press in load_wav.
 
 
  function load_wav_Callback(hObject, eventdata, handles)
 
 
  % hObject handle to load_wav (see GCBO)
 
 
  % eventdata reserved - to be defined in a future version of MATLAB
 
 
  % handles structure with handles and user data (see GUIDATA)
 
 
   global x t;
 
 
   [FileName,PathName] = uigetfile('*.wav');
 
 
   pathall=strcat(PathName,FileName);%獲得wav路徑
 
  
 
 
   [x,FS]=audioread(pathall);%讀取wav檔案的資料和頻率
 
 
   t=(0:length(x)-1)/FS;%變換得到播放時間
 
  
 
  
 
 
  % --- Executes on selection change in listbox1.
 
 
  function listbox1_Callback(hObject, eventdata, handles)
 
 
  % hObject handle to listbox1 (see GCBO)
 
 
  % eventdata reserved - to be defined in a future version of MATLAB
 
 
  % handles structure with handles and user data (see GUIDATA)
 
  
 
 
  % Hints: contents = get(hObject,'String') returns listbox1 contents as cell array
 
 
  % contents{get(hObject,'Value')} returns selected item from listbox1
 
  
 
  
 
 
  % --- Executes during object creation, after setting all properties.
 
 
  function listbox1_CreateFcn(hObject, eventdata, handles)
 
 
  % hObject handle to listbox1 (see GCBO)
 
 
  % eventdata reserved - to be defined in a future version of MATLAB
 
 
  % handles empty - handles not created until after all CreateFcns called
 
  
 
 
  % Hint: listbox controls usually have a white background on Windows.
 
 
  % See ISPC and COMPUTER.
 
 
  if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
 
 
   set(hObject,'BackgroundColor','white');
 
 
  end
 
  
 
  
 
 
  % --- Executes on button press in uncle_wav.
 
 
  function uncle_wav_Callback(hObject, eventdata, handles)
 
 
  % hObject handle to uncle_wav (see GCBO)
 
 
  % eventdata reserved - to be defined in a future version of MATLAB
 
 
  % handles structure with handles and user data (see GUIDATA)
 
 
   global x t;
 
 
   a=imread('C:\Users\Administrator\Desktop\zzz\dashu.JPG');%讀取圖片
 
 
   axes(handles.axes1);
 
 
   imshow(a);%顯示圖片
 
 
   %wav處理
 
 
   x3=x*2;%低沉~悶
 
 
   t3=t*1.5;
 
 
   FS3=(0:length(x)-1)/t3;
 
 
   sound(x3,FS3);%播放處理後的音訊資料
 
 
  % --- Executes on button press in sister_wav.
 
 
  function sister_wav_Callback(hObject, eventdata, handles)
 
 
  % hObject handle to sister_wav (see GCBO)guide
 
 
  % eventdata reserved - to be defined in a future version of MATLAB
 
 
  % handles structure with handles and user data (see GUIDATA)
 
 
   global x t;
 
 
   a=imread('C:\Users\Administrator\Desktop\zzz\luoli.JPG');
 
 
   axes(handles.axes1);
 
 
   imshow(a);
 
 
   x2=x;%還可以~湯姆貓style,尖銳亢奮,papi醬
 
 
   t2=t/1.5;
 
 
   FS2=(0:length(x)-1)/t2;
 
 
   sound(x2,FS2)
 
  
 
 
  % --- Executes on button press in whimsy_wav.
 
 
  function whimsy_wav_Callback(hObject, eventdata, handles)
 
 
  % hObject handle to whimsy_wav (see GCBO)
 
 
  % eventdata reserved - to be defined in a future version of MATLAB
 
 
  % handles structure with handles and user data (see GUIDATA)
 
 
   global x t;
 
 
   a=imread('C:\Users\Administrator\Desktop\zzz\gaoguai.JPG');
 
 
   axes(handles.axes1);
 
 
   imshow(a);
 
 
   x1=x;%還可以~湯姆貓style,尖銳亢奮,papi醬
 
 
   t1=t/2;
 
 
   FS1=(0:length(x)-1)/t1;
 
 
   sound(x1,FS1);
 
  
 
  
 
 
  % --- Executes on button press in stop_wav.