You are on page 1of 5

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: %g\n',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');
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);
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: %g\n',r);
elseif choice==2
fprintf(2,'Nhiet do (do C) la: %g\n',c);
elseif choice==3
fprintf(2,'Nhiet do (do C) la: %g\n',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: ']);
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. 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

You might also like