如何在不正确的Matlab GUI上停下来?

时间:2016-08-04 17:02:39

标签: matlab user-interface callback

我想从显示的图像中获取矩形坐标。我想要下一步和后面移动图像。这是我的matlab GUI enter image description here

所以当我按下它时,它应该显示下一个串联的图像,类似的是后退按钮。我正在使用此代码

function next_Callback(hObject, eventdata, handles)
% hObject    handle to next (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
if handles.mypointer~=length(handles.cur_images)
    handles.mypointer=handles.mypointer+1;
    pic=imread(fullfile('images',handles.cur_images(handles.mypointer).name));
    handles.imageName=handles.cur_images(handles.mypointer).name;
    imshow(pic);
    h=imrect;
    getMyPos(getPosition(h));
    addNewPositionCallback(h,@(p) getMyPos(p));
    fcn = makeConstrainToRectFcn('imrect',get(gca,'XLim'),get(gca,'YLim'));
    setPositionConstraintFcn(h,fcn);
    handles.output = hObject;
    handles.posi=getPosition(h);
    guidata(hObject, handles);

但是这个代码的缺点是当按下下一个按钮然后它停在h=imrect上,等待用户绘制矩形。如果我不绘制矩形,它什么都不做。即使我再次按下或按下按钮也没有任何作用,因为它仍在等待用户绘制矩形。如果这是一个显而易见的问题,我很抱歉,但我是matlab GUI的新手 的问题:
如何让程序停在Imrect

1 个答案:

答案 0 :(得分:0)

很少有人注意到:

  • 我认为最好的做法是将imrect移动到单独的按钮,就像Excaza提到的那样。
  • 我无法重复您的问题 - 我创建了GUI示例,所有按钮在执行imrect后都是响应式的。
  • 我还建议执行h = imrect(handles.axes1);而不仅仅是' h = imrect;`(我不知道它是否与您的问题有关)。

当我遇到Matlab"阻塞函数"的问题时,我通过执行定时器对象的回调函数内的函数来解决它。
我不知道这是一个好习惯,它只是我解决它的方式......
在定时器回调内执行一个函数,允许继续执行主程序流程。

以下代码示例演示如何创建计时器对象,并在计时器的回调函数中执行imrect。 样本创建" SingleShot"定时器,并在执行时间start功能后触发200毫秒执行的回调。

function timerFcn_Callback(mTimer, ~)
handles = mTimer.UserData;
h = imrect(handles.axes1); %Call imrect(handles.axes1) instead just imrect.
% getMyPos(getPosition(h));
% ...

%Stop and delete the timer (this is not a goot practice to delete timer here - this is just an exampe).
stop(mTimer);
delete(mTimer);


function next_Callback(hObject, eventdata, handles)
% if handles.mypointer~=length(handles.cur_images)
% ...
% h = imrect(handles.axes1);

%Create new "Single Shot" timer (note: it is not a good practice to create new timer each time next_Callback is executed).
t = timer;
t.TimerFcn = @timerFcn_Callback; %Set timer callback function
t.ExecutionMode = 'singleShot';  %Set mode to "singleShot" - execute TimerFcn only once.
t.StartDelay = 0.2;              %Wait 200msec from start(t) to executing timerFcn_Callback.
t.UserData = handles;            %Set UserData to handles - passing handles structure to the timer.

%Start timer (function timerFcn_Callback will be executed 200msec after calling start(t)).
start(t);

disp('Continue execution...');