2014-03-27 58 views

回答

2

您是否使用指南或“纲领性”鬼?以下是程序化gui的一个小例子;类似的概念可能适用于GUIDE。 (我个人比较喜欢的编程GUI路线的更大的灵活性,再加上我总是最终无可挽回地打破任何向导GUI的创建...)

反正几件事情要在这个例子说明:

  1. 使用gui的图形处理UserData字段来存储“全局”信息。这是在回调之间传递数据的一种方式。
  2. 需要在“无限”循环中的暂停语句,以便处理来自cb_button2的中断。从Matlab help开始:“如果回调执行的对象的Interruptible属性为开启状态,则回调可能会中断,但只有当它或触发的函数调用drawnow,figure,getframe,pause或waitfor “。

    function my_gui(varargin) 
    
        mainfig = figure; 
    
        out.h_button1 = uicontrol(mainfig,... 
               'Style','pushbutton',... 
               'Units','Normalized',... 
               'Position',[0,0.5,1,0.5],... 
               'String','Button 1',... 
               'Callback',@cb_button1); 
    
        out.h_button2 = uicontrol(mainfig,... 
               'Style','pushbutton',... 
               'Units','Normalized',... 
               'Position',[0,0,1,0.5],... 
               'String','Button 2',... 
               'Callback',@cb_button2); 
    
        out.button2_flag = 0; %flag indicating whether button 2 has been pressed yet 
    
        set(mainfig,'UserData',out);%store "global" data in mainfig's UserData (for use by callbacks)   
    
    
    function cb_button1(varargin) 
    
        out = get(gcbf,'UserData'); %gcbf: handle of calling object's figure 
    
        while ~out.button2_flag 
         disp('Aaaahhh, infinite loop! Quick press Button 2!'); 
         out = get(gcbf,'UserData'); %reload "global" data 
         pause(0.1); %need this so this callback may be interrupted by cb_button2 
        end 
    
        disp('Thanks! I thought that would never end!'); 
    
    
    function cb_button2(varargin) 
        out = get(gcbf,'UserData'); %gcbf: handle of calling object's figure 
        out.button2_flag = 1; 
        set(gcbf,'UserData',out); %save changes to "global" data 
    
+0

+1的消息显示:-)好了,并回答太 –

+0

而不是暂停(),你可以设置按钮的回调是interuptable。它只是uicontrol的另一个属性,所以您可以在创建时设置它。 –