我在MATLAB中使用程序化GUI,它使用多个图形窗口。当我按下图A中的“重绘”按钮时,会出现一个新的图形(图B)并绘制一些数据。我希望焦点立即切换回图A,因为我在该窗口中使用了许多热键(WindowKeyPressFcn)来更新图B中的图。
这里有两个问题:
1)按钮'Redraw'的回调的最后一行确实将焦点切换回图A,但仅当图B已存在时才切换。也就是说,第一次创建图B时,它仍然是焦点。如果我然后使用图A来更新图B中的图,则焦点正确地切换回图A.我无法想到在第一次重绘和所有后续调用期间它的行为方式不同。
2)更大的问题是,如果我在代码中的任何地方设置断点然后继续执行,焦点会根据需要切换回图A.那么,为什么进入调试器而不做任何其他事情来解决问题呢?如果调试器中的一切正常,我怎么能找到问题?
提前致谢!
编辑:令我惊讶的是,通过编写我的第一个程序化GUI,我能够重现这个“Heisenbug”。这应该是我问题的最简单的例子。要查看它的实际效果,只需运行下面的代码并单击按钮即可。出于某种原因,当第一次创建窗口2时,焦点不会按预期切换回窗口1。它适用于所有后续按钮按下。尝试关闭窗口2并再次按下按钮,错误将继续发生。
正如原帖中所述,在代码中设置断点可以解决问题。在第27行设置断点,然后继续执行,窗口1将处于焦点。
这里发生了什么?
function heisenbug
%% Main problem:
% After clicking the push button, I want the focus to
% always switch back to Window 1 (the one containing the button).
% However, this does not work when Window 2 is first created.
%%
%% Create and then hide the GUI as it is being constructed
f = figure('Visible','off','name','Window 1','units','normalized','Position',[0.1 0.1 0.5 0.5]);
%% Initialize handles structure
handles = guihandles(f);
handles.window2 = [];
guidata(f,handles)
%% Make a button
hbutton = uicontrol('Style','pushbutton','String','Push me','units','normalized',...
'Position',[0.1 0.1 0.8 0.8],...
'Callback',@button_Callback);
%% Make the GUI visible
f.Visible = 'on';
%% Button callback
function button_Callback(source,eventData)
handles = guidata(gcbo);
% If Window 2 already exists, plot a circle, then switch focus back to Window 1.
if ~isempty(handles.window2) && ishandle(handles.window2)
figure(handles.window2);
plot(1,1,'bo')
figure(f);
% Otherwise, create Window 2 and do the same thing.
else
handles.window2 = figure('Name','Window 2','units','normalized','position',[0.4 0.1 0.5 0.5]);
plot(1,1,'bo')
figure(f)
end
guidata(source,handles)
end
end
答案 0 :(得分:0)
我的帖子很快被Adam(谢谢!)在MathWorks网站上回答:http://se.mathworks.com/matlabcentral/answers/299607-simply-entering-the-debugger-during-execution-of-matlab-gui-fixes-error-that-persists-during-normal。
我需要在创建Window 2之后插入pause(0.05)
,然后尝试将焦点切换回figure(f)
。否则,焦点在完成绘图时会被盗回窗口2。