2016-08-14 4 views
-1

Ich verwende eine programmatische GUI in MATLAB, die mehrere Zahlenfenster verwendet. Wenn ich den Knopf 'Neuzeichnen' in Abbildung A drücke, erscheint eine neue Figur (Abbildung B) mit einigen geplotteten Daten. Ich möchte den Fokus sofort auf Abbildung A wechseln, weil es viele Hotkeys (WindowKeyPressFcn) sind, die ich in diesem Fenster verwenden, um die Grundstücke in Abbildung B.Einfache Eingabe des Debuggers während der Ausführung der MATLAB GUI behebt einen Fehler, der während der normalen Ausführung bestehen bleibt

Es gibt zwei Probleme hier zu aktualisieren:

1) Die Die letzte Zeile des Callbacks für die Schaltfläche 'Redraw' schaltet den Fokus wieder auf Abbildung A zurück, ABER nur, wenn Abbildung B bereits existiert. Das heißt, wenn B das erste Mal erstellt wird, bleibt es im Fokus. Wenn ich dann Abbildung A verwende, um die Diagramme in Abbildung B zu aktualisieren, wechselt der Fokus korrekt zurück zu Abbildung A. Ich kann mir nicht vorstellen, warum er sich während des ersten Neuzeichnens und aller nachfolgenden Aufrufe anders verhält.

2) Das noch größere Problem ist, dass, wenn ich irgendwo im Code einen Haltepunkt setze und dann die Ausführung fortsetze, der Fokus zurück zu Abbildung A, wie ich will. Also, warum macht das Eingeben des Debuggers und nichts anderes das Problem zu beheben? Wie kann ich das Problem finden, wenn alles im Debugger funktioniert?

Vielen Dank im Voraus!

EDIT: Zu meiner großen Überraschung konnte ich diesen "Heisenbug" reproduzieren, indem ich meine erste programmatische GUI schrieb. Dies sollte das einfachste Beispiel für mein Problem sein. Um es in Aktion zu sehen, führen Sie einfach den folgenden Code aus und klicken Sie auf die Schaltfläche. Wenn Fenster 2 zum ersten Mal erstellt wird, wechselt der Fokus aus bestimmten Gründen NICHT wie beabsichtigt zurück zu Fenster 1. Es funktioniert ordnungsgemäß für alle nachfolgenden Tastendrücke. Versuchen Sie Fenster 2 zu schließen und drücken Sie die Taste erneut, der Fehler wird weiterhin auftreten.

Wie im ursprünglichen Post erwähnt, löst das Festlegen eines Haltepunkts im Code das Problem. Legen Sie einen Haltepunkt in Zeile 27 fest und setzen Sie die Ausführung fort, und Fenster 1 wird scharfgestellt.

Was passiert hier?

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 
+1

Du hast eine Heisenbug bekam: https://en.wikipedia.org/wiki/Heisenbug –

+0

Nun, das ist Spaß, aber es hat das Problem der Benennung nicht weg :( – raz

+0

Bitte geben Sie [MCVE] – excaza

Antwort

Verwandte Themen