Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Chuong3

124 views

Published on

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Chuong3

  1. 1. ch−¬ng 3: Giao diÖn ®å ho¹ GUI §1. Kh¸i niÖm chung §Ó tiÖn dông ta cã thÓ t¹o nªn giao diÖn ®å ho¹(GUI - Graphic User Interface) gi÷a ng−êi dïng vµ MATLAB. Trong giao diÖn nµy ta cã thÓ xuÊt d÷ liÖu d−íi 2 d¹ng: v¨n b¶n vµ ®ß ho¹. Mçi mét GUI cã mét hay nhiÒu layout(diÖn m¹o). §Ó t¹o ra vµ xö lÝ layout ciña GUI ta nhËp lÖn guide vµ nhËn ®−îc mét layout rçng vµ cöa sæ Guide Control Panel. ViÖc t¹o GUI t¹o nªn mét c«ng cô ®å ho¹ phôc vô nhËp xuÊt d÷ liÖu mét c¸ch trùc gi¸c, rÊt thuËn tiÖn. Ngoµi ra cã thÓ dïng GUI ®Ó gi¸m s¸t c¸c qu¸ tr×nh, hiÓn thÞ c¸c ®èi t−îng. §2. nhËp xuÊt kÝ tù, sè liÖu ra GUI 1. T¹o khung h×nh: Ta xÐt c¸c lÖnh sau: f = input('Enter temperature(degree K): '); c = (f - 32)*5/9; fprintf(1,'Temperature(degree C) is: %gn',c) Ba dßng lÖnh trªn thùc hiÖn c¸c c«ng viÖc sau: - nhËp gi¸ trÞ ®Çu vµo - thùc hiÖn phÐp tÝnh quy ®æi nhiÖt ®é - xuÊt kÕt qu¶ ra mµn h×nh B©y giê ta t×m c¸ch cµi c¸c dßng lÖnh trªn sao cho chóng thùc hiÖn trªn khu«n khæ mét khung ®å ho¹ nµo ®ã. §Ó t¹o hai khung h×nh ch÷ nhËt trong cöa sæ Figure hiÖn hµnh víi nÒn mµu x¸m ta nhËp vµo c¸c lÖnh sau: set(gcf,'DefaultUicontrolUnit','Normalized') frame1_ = uicontrol(gcf,'Style','Frame','Position',[0.1 0.1 0.8 0.3]); frame2_ = uicontrol(gcf,'Style','Frame','Position',[0.1 0.6 0.8 0.3]); set(frame1_,'BackgroundColor',[0.5 0.5 0.5]); set(frame2_,'BackgroundColor',[0.5 0.5 0.5]); Hai khung (Frames) cã to¹ ®é c¸c gãc d−íi tr¸i lµ (0.1, 0.1) vµ (0.1, 0.6), cïng chiÒu cao 0.3 ®¬n vÞ vµ bÒ réng 0.8 ®¬n vÞ. §¬n vÞ ®−îc t×nh b»ng % cña kÝch c÷ ngoµi cña Figure. VËy ta cã thÓ diÔn gi¶i nh− sau: - Khung thø nhÊt cèÝgc tr¸i d−íi t¹i ®iÓm cã to¹ ®é 10% chiÒu ngang vµ 10% chiÒu cao cña khung ngoµi Figure. - Khung thø 2 cã gãc tr¸i phÝa d−íi t¹i ®iÓm cã to¹ ®ä øng víi 10% chiÒu ngang vµ 60% chiÒu cao cña khung ngo×a Figure. - C¶ hai khung cã chiÒu cao b»ng 30% chiÒu cao vµ bÒ ngang b»ng 80% bÒ ngang cña khung ngoµi Figure. 2. Dïng lÖnh edit vµ text ®Ó nhËp xu¸t kÝ tù vµ sè liÖu: Trªn ®©y ta ®· dïng lÖnh uicontrol ®Ó t¹o vµ x¸c ®Þnh vÞ trÝ hai khung h×nh. §o¹n lÖnh sau ®©y dïng uicontrol ®Ó viÕt chuçi kÝ tù “Fahrenheit” lªn khung bªn trªn: text_f_=uicontrol(gcf,'Style','Text','String','Fahrenheit: ',... 'Position',[0.3 0.7 0.2 0.05],'HorizontalAlignment','Left'); Chuçi kÝ tù “Fahrenhaeit” ®−îc ®Æt vµo ®óng vÞ trÝ dån tr¸i cña « cã Position ghi trong ®o¹n ch−¬ng tr×nh trªn. §¹on lÖnh sau dïng Edit ®Ó viÕt chuçi kÝ rù “68.0” vµo vÞ trÝ bªn c¹nh cña “Fahrenheit”. Chuçi kÝ tù cã vÞ trÝ dån ph¶i trong « (Position Box). edit_f_=uicontrol(gcf,'Style','edit','String','68.0’... ,'Position',[0.6 0.7 0.2 0.05],'HorizontalAlignment','Right,’Callback’,’fc_calc');
  2. 2. Do sö dông edit, chuçi kÝ tù “68.0” lµ chuçi cã thÓ viÕt l¹i ®−îc trùc tiÕp trªn GUI. Sau khi nhÊn nót trªn, gi¸ trÞ míi viÕt l¹i ®−îc tiÕp nhËn vµ MATLAB sÏ gäi lÖnh viÕt trong phÇn callback: fc_calc. Cuèi cïng ta cßn ph¶i dïng uicontrol ®Ó t¹o ta chuçi text, hiÓn thÞ chuçi “Celcius” vµ “20.0” trong khung bªn d−íi. text_c1_= uicontrol(gcf,'Style','Text','String','Celcius: ',... 'Position',[0.3 0.3 0.2 0.05],'HorizontalAlignment','Left'); text_c2_= uicontrol(gcf,'Style','Text','String','20.0','Position',... [0.6 0.3 0.1 0.05],'HorizontalAlignment','Left'); §Ó thuËn tiÖn ta nªn viÕt c¸c lÖnh nµy nµy trong mét file script. 3. Tù ®éng cËp nhËt gi¸ trÞ lªn GUI: §Ó hoµn thiÖn vÝ dô GUI ta thùc hiÖn ch−¬ng tr×nh víi nhiÖm vô tÝnh quy ®æi tõ ®é K sang ®é C vµ tù ®éng ®iÒn kÕt qu¶ vµo c¸c « bªn ¹ch chuçi Celcius. §o¹n ch−¬ng tr×nh nµy phôc vô môc ®Ých callback (hoµn tr¶ gi¸ trÞ) ®−îc l−u vµo file fc_calc.m vµ cã néi dung nh− sau: f = get(edit_f_,'String'); f = str2num(f); c = (f-32)*5/9; c = num2str(c); set(text_c2_,'String',c); §o¹n m· trªn nhËn gi¸ trÞ do lÖnh uicontrol “edit” ®äc vµo d−íi d¹ng chuçi (string) vµ sau ®ã: - biÕn ®æi tõ d¹ng string sang d¹ng sè - tÝnh quy ®æi tõ nhiÖt ®é fahrenheit sang nhiÖt ®é celcius - biÕn ®æi tõ sè sang string - xuÊt kÕt qu¶ d−íi d¹ng string ra GUI nhê text_c2_ §3. nhËp sè liÖu tõ thanh tr−ît Ngo×a c¸ch nhËp sè liÖu tõ bµn phÝm, ta cã thÓ nhËp sè liÖu tõ thanh tr−ît. MATLAB chØ hç trù c¸c thanh tr−ît n»m ngang chø kh«ng hç trî c¸c thanh tr−ît th¼ng ®øng. §Ó t¹o thanh tr−ît ta dïng lÖnh: slider_f_ = uicontrol(gcf,'Style','Slider','Min',... 32.0,'Max',212.0,'Value',68.0,'Position',[0.6 0.8 0.2 0.05],... 'Callback','fc_slider_f;fc_calc'); Nh− vËy Callback cã thÓ gäi mét chuçi c¸c lÖnh MATLAB, ph©n c¸ch nhau b»ng dÊu chÊm than hay dÊu phÈy. Chuçi callback gäi fc_silder_f.m: f = get(slider_f_,'Value'); f = num2str(f); set(edit_f_,'String',f); víi t¸c dông nhËp nhiÖt ®é gi÷ t¹i ‘Value’ cña slider_f_ vµo vÞ trÝ bªn c¹nh « chøa chuçi “Fahrenheit”. Sau ®ã Callback gäi tiÕp fc_calc.m ®Ó tÝnh quy ®æi gi¸ trÞ nhiÖt ®é vµ g¸n vµo « c¹nh chuçi “Celcius”. Tuy nhiªn ®Ó nhËp ®−îc gi¸ trÞ míi do ng−êi dïng thanh tr−ît g©y nªn , ta ph¶i thay ®æi l¹i chuçi lÖnh nh− sau: slider_f_ = uicontrol(gcf,'Style','Slider','Min',... 32.0,'Max',212.0,'Value',68.0,'Position',[0.6 0.8 0.2 0.05],... 'Callback','fc_edit_f, fc_calc'); Trong ®ã file fc_edit_f.m nh− sau: f = get(edit_f_,'String'); f= str2num(f); set(slider_f_,'Value',f);
  3. 3. cã nhiÖm vô cËp nhËt gi¸ trÞ gi÷ t¹i ‘Value’ cña slider_f_ ®Ó råi sau ®ã fc_calc.m lµm nèt phÇn viÖc cßn l¹i: tÝnh ®æi nhiÖt ®é vµ g¸n vµo vÞ trÝ c¹nh « chøa chuçi “Celcius”. §4. nhËp sè liÖu tuú chän 1. Kh¸i niÖm chung: Ngoµi kh¶ n¨ng nhËp d÷ liÖu cè ®Þnh theo kiÓu string hay kiÓu sè, ta cã thÓ nhËp d÷ liÖu theo mét danh môc nµo ®ã. §Ó minh ho¹, ta t¹o file test.m nh− sau: f = input('Nhap nhiet do: '); r = f+459.7; c = (f-32)*5/9; k = c+273.15; choice = input(['Nhap 1 cho Rankie','2 cho Celcius','3 cho Kelvin: ']); if choice==1 fprintf(1,'Nhiet do (do R) la: %gn',r); elseif choice==2 fprintf(2,'Nhiet do (do C) la: %gn',c); elseif choice==3 fprintf(2,'Nhiet do (do C) la: %gn',c); end Tõ cöa sæ lÖnh, nhËp lÖnh test th× MATLAB sÏ hái nhiÖt ®é vµ ®Ých quy ®æi råi hiÓn thÞ kÕt qu¶. Tuy hhiªn c«ng cô GUI cña MATLAB cho phÐp ta thùc hiÖn viÖc lùa chän thuËn lîi h¬n. ta cã thÓ chän mét trong 4 ph−¬ng ¸n nhËp d÷ liÖu sau ®©y: - dïng menu - dïng list box - dïng radio button - dïng check box 2. Dïng menu: ta xo¸ bá chuçi “Celcius” trong lÖnh text_c1_ vµ thay vµo ®ã kh¶ n¨ng chän theo popup menu nh− sau: delete(text_c1_); pop_c_ = uicontrol( gcf, ‘Style’, ‘Popupmenu’,... ‘String’, ‘Rankine|Celcius|Kelvin’,... ‘Value’, 2,... ‘Position’, [0.0 .3 0.2 0.05],... ‘Callback’, ‘fc_popup_c;fc_calc2’); Khi kÝch chuét vµo Popup Menu , cã ba kh¶ n¨ng chän lùa sÏ xuÊt hiÖn. TiÕp tôc nh¸y chuét vµo mét trong 3 kh¶ n¨ng ®ã , Popup Menu biÕn mÊt chØ cßn l¹i ®¬n vÞ ®−îc chän. Khi dïng chuét kÐo thanh tr−ît ë frame phÝa trªn, ta cã ®−îc gi¸ trÞ quy ®æi sang ®¬n vÞ ®−îc chän hiÓn thÞ ë phÝa d−íi. Trong ®o¹n ch−¬ng tr×nh trªn, gi¸ trÞ ‘Value’ ®Æt s½n lµ 2. Khi Callback gäi fc_popup_c.m: choice = get(popup_c_,’Value’); h× gi¸ trÞ cña biÕn choice ®−îc ®−a tíi ‘Value’. Sau ®ã Callback gäi tiÕp fc_calc2.m ®Ó xem kÕt qu¶ gi÷ trong choice. File fc_calc2.m nh− sau: f = get(edit_f_,'String'); f = str2num(f); r= f+459.7; c = (f-32)*5/9; k = c+273.15; choice = input(['Nhap 1 cho Rankie','2 cho Celcius','3 cho Kelvin: ']);
  4. 4. if choice==1 t = r; elseif choice==2 t = c; elseif choice==3 t= k end t = num2str(t); set(text_c2_,'String',t); CÇn l−u ý r»ng ®Ó ®¹t ®−îc kÕt qu¶ , ta cßn ph¶i b¸o cho edit vµ slider uicontrol biÕt ®Ó dïng fc_calc2.m b»ng c¸ch bæ sung thªm c¸c dßng sau: set(edit_f_,... ‘Callback’,’fc_edit_f;fc_calc2’); set(edit_f_,... ‘Callback’,’fc_slider_f;fc_calc2’); B»ng c¸ch thay ‘Popupmenu’ b»ng ‘Listbox’ uicontrol ta cã ph−¬ng ¸n listbox. §iÓm kh¸c duy nhÊt lµ khi chän, Popupmenu chØ chøa mét phÇn tö th× listbox cã thÓ ®ång thêi chøa nhiÒu phÇn tö, phô thuéc duy nhÊt vµo chiÒu cao t¹i vÞ trÝ(‘Position’ property). 3. Dïng radio button: Ta dïng lÖnh delete(popup_c_) ®Ó xo¸ uicontrol t¹o Popup Menu “Rankine | Celcius | Kelvin” vµ thªm vµo 3 uicontrol t¹o 3 nót chän thø nguyªn nhiÖt ®é sau: delete(popup_c_); strings = [‘Rankine’;’Celcius’;’Kelvin’]; show = [ 0 ; 1 ; 0 ]; ys = [ 3 ; 2 ; 1]* 0.075 + 0.075; for i = 1:3 radio_c_(i) = uicontrol( gcf, ‘Style’,‘Radiobutton’,... ‘String’, strings(i),... ‘Value’, show(i),... ‘Posiotion’, [0.3 ys(i) 0.0 0.05],... ‘Callback’, ‘fc_radio_c;fc_calc2’); ta dïng mét chuçi Callback cho c¶ 3 nót. Tr−íc hÕt Callbackgäi fc_radio_c.m ®Ó nhË biÕt nót nµo(1, 2 hay 3) ®−îc chän, sau ®ã cÊt gi¸ trÞ biÕn ®−îc chän vµo choice. for i = 1:3 if gcbo == radio_c_(i) choice = i; set(radio_c_(i),’Value’,1); else set(radio_c_(i),’Value’,0); end; end; §o¹n script trªn lµ mét vßng lÆp, so s¸nh sè (handle) Callback thu ®−îc (gi¸ trÞ do hµm gcbo tr¶ vÒ) víi handle cña mçi nut. Nót nµo cã sã trïng sÏ ®−îc ®ãng (turn on, ‘Value’ = 1) vµ nótnµo kh¸c sè sÏ bÞ ng¾t (turn off,’Value’ = 0). Cuèi cïng Callback gäi fc_calc2.m ®Ó thùc hiÖn viÖc tÝnh quy ®æi ®−îc chän vµ hiÓn thÞ kÕt qu¶.    
  5. 5. §5. c¸c ph−¬ng ph¸p t¹o gui 1. T¹o GUI b»ng c«ng cô ®å ho¹: Trªn ®©y ta ®· xem xÐt c¸ch t¹o GUI b»ng ph−¬ng ph¸p thñ c«ng. Ta cã thÓ t¹o GUI b»ng c«ng cô ®å ho¹. Khi nhËp lÖnh guide ta gäi tr×nh ®å ho¹ ®Ó s¹on th¶o layout. KÕt qu¶ ®Çu tiªn lµ ta cã mét layout rçng. ViÖc ®Çu tiªn

×