Matlab 版 (精华区)
发信人: candle ( 马 走 日), 信区: Matlab
标 题: GUI FAQ (from Mathworks)
发信站: 紫 丁 香 (Mon Dec 27 22:00:54 1999), 转信
Problem Description
I want to build a Graphical User Interface (GUI) that waits for input fr
om a
user. How can I create a modal figure that pauses the execution of an M-
file to
prompt a user for input?
Solution:
There are several ways to program GUIs to wait for user input. The first
part
of this solution addresses MATLAB 5 and the end of this solution is for
MATLAB 4 users.
Method 1: UIWAIT
This method involves writing a function which creates the GUI manually.
This
type of capability is not currently available through GUIDE. Here is a q
uick
example.
The following M-File creates a new figure with an editable text box and
a
push button. The function creates these objects and then makes a call to
the
UIWAIT function. UIWAIT tells the function to pause its execution until
a
certain condition is met. In this case, the input argument f (the handle
to the
GUI figure) tells UIWAIT to pause execution until either "f" is closed o
r until
"uiresume(f)" is called. Pressing the "Done" pushbutton accomplishes two
tasks:
- Causes the string property of the editable text box to be updated inte
rnally.
- Its CallBack "uiresume(f)" continues the execution of the M-File.
%% Beginning of M-File GETINFO %%
function out = getinfo;
f = figure('Units','Normalized',...
'Position',[.4 .4 .3 .3],...
'NumberTitle','off',...
'Name','Info');
e = uicontrol('Style','Edit',...
'Units','Normalized',...
'Position',[.1 .4 .3 .1],...
'Tag','myedit');
p = uicontrol('Style','PushButton',...
'Units','Normalized',...
'Position',[.6 .4 .3 .1],...
'String','Done',...
'CallBack','uiresume(gcbf)');
uiwait(f)
out = str2num(get(e,'String'));
close(f)
To call GETINFO from an M-File or the Command Line:
a = getinfo
This example can be easily extended to include more edit boxes.
Method 2: Use one of MATLAB's custom dialog box functions
Here is a list of the dialog box functions shipped with MATLAB that can
be
used along with UIWAIT, as of MATLAB 5.3:
dialog - Create dialog figure.
axlimdlg - Axes limits dialog box.
errordlg - Error dialog box.
helpdlg - Help dialog box.
inputdlg - Input dialog box.
listdlg - List selection dialog box.
menu - Generate menu of choices for user input.
msgbox - Message box.
questdlg - Question dialog box.
warndlg - Warning dialog box.
uigetfile - Standard open file dialog box.
uiputfile - Standard save file dialog box.
uisetcolor - Color selection dialog box.
uisetfont - Font selection dialog box.
pagedlg - Page position dialog box.
pagesetupdlg - Page setup dialog.
printpreview - Display preview of figure to be printed.
printdlg - Print dialog box.
waitbar - Display wait bar.
For example:
h=helpdlg('Push OK to plot peaks');
uiwait(h);
peaks;
If you are using MATLAB 4, some of the features mentioned above are not
available. Here some suggestions with respect to MATLAB 4:
In general, we recommend that you not make the GUI wait. Instead, you sh
ould
break the program into several smaller steps or programs. For example, t
he
following M-file, bgui.m builds a GUI that evaluates the input in an edi
t
uicontrol:
function bgui(state)
if nargin == 0 % Build the GUI
% Create the Figure Window
figure('Units','normal','Position',[.25 .25 .5 .5], ...
'Name','BGUI Example','NumberTitle','off', ...
'Color','w');
% Set the default units for uicontrols to 'normal'.
% This makes it easier to place the uicontrols, and
% the increase/decrease in size if the figure is
% resized.
set(gcf,'DefaultUicontrolUnits','normal')
% Add a static text uicontrol
st = uicontrol('Style','text','String','Enter Command:', ...
'Position',[.1 .8 .8 .1], ...
'BackgroundColor','w','ForegroundColor','k', ...
'HorizontalAlignment','left');
% Add the edit uicontrol
h = uicontrol('Style','edit','Position',[.1 .6 .8 .2], ...
'min',0,'max',2)
% Add the push button
i = uicontrol('Style','push','Position',[.1 .2 .8 .3], ...
'String','Evaluate Edit Block', ...
'CallBack','bgui(''evaluate'')');
% Store the handle to the edit block in the figures
% UserData property. This is done to avoid the use of
% global variable. See the UserData section in the
% Building a Graphical User Interface Guide for more
% information.
set(gcf,'UserData',h)
elseif strcmp(state,'evaluate') % Push button selected
% Get the handle to the edit uicontrol
h = get(gcf,'UserData');
% Extract the command
com = get(h,'String');
% Evaluate the string using eval(try,catch)
eval(com,'error(''Invalid MATLAB Command'')')
end
By using this method, the GUI is never in a paused state. When bgui is c
alled,
it builds the GUI and ends. When the push button is selected, it calls b
gui using
'evaluate' as the input. This will execute only the portion of code asso
ciated
with the 'evaluate' in the IF statements.
This method is known as switch-yard programming because the GUI is drivi
ng
the program. Based on the action of the GUI, it will call the same funct
ion
using different inputs to "switch" between tasks.
An alternative method is to use a polling loop to pause the M-file. Belo
w is a
brief example of how to do this:
% Create the Figure Window
figure('Units','normal','Position',[.25 .25 .5 .5], ...
'Name','BGUI Example','NumberTitle','off', ...
'Color','w');
% Set the default units for uicontrols to 'normal'.
% This makes it easier to place the uicontrols, and
% the increase/decrease in size if the figure is
% resized.
set(gcf,'DefaultUicontrolUnits','normal')
% Add a static text uicontrol
st = uicontrol('Style','text','String','Enter Command:', ...
'Position',[.1 .8 .8 .1], ...
'BackgroundColor','w','ForegroundColor','k', ...
'HorizontalAlignment','left');
% Add the edit uicontrol
h = uicontrol('Style','edit','Position',[.1 .6 .8 .2], ...
'min',0,'max',2)
% Add the push button
i = uicontrol('Style','push','Position',[.1 .2 .8 .3], ...
'String','Evaluate Edit Block', ...
'CallBack','set(gcf,''UserData'',1)');
% Start the polling loop
while get(gcf,'UserData')~=1
drawnow
end
eval(get(h,'String'),'disp(''Invalid Command'')')
In this method, the WHILE loop continues to execute until the push butto
n is
selected. Note that if you are using a PC, background processing must be
enabled. To enable background processing, click on the Option menu in th
e
Command Window and select Enable Background Processing. If Disable
Background Processing is displayed, then background processing is alread
y
enabled.
--
风来疏竹,风过而竹不留声;
雁度寒潭,雁去而潭不留影。
故君子事来而心始现,事去而心随空。
※ 来源:.紫 丁 香 bbs.hit.edu.cn.[FROM: 150.59.34.186]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:11.582毫秒