WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

wie GUIs in .m File aufrufen und an dieser Stelle ausführen

 

marc-205

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.12.2012, 10:13     Titel: wie GUIs in .m File aufrufen und an dieser Stelle ausführen
  Antworten mit Zitat      
Hallo,

ich habe folgendes Problem. Ich habe ein .m File (1), in dem ich bisher zunächst einzelne .m Files aufrufe, die die für eine Rechnung benötigten Variablen mit den jeweiligen Startwerten (quasi Eingabewerte) belegen.
In diesem ersten .m File hab ich jetzt versucht für diese Eingabewerte GUIs einzubinden, wo der Nutzer die Werte einträgt (ein größeres mit Edit Text Boxen und 2 mit schiebereglern), und so nicht jedes mal in den .m files rumschreiben muss. Wenn ich das erste .m File ausführe, werden die GUIs auch aufgerufen, aber der Rest des .m Files wird auch direkt ausgeführt, statt darauf zu "warten" bis im GUI Daten eingegeben sind.

Wie kann man dafür sorgen, dass wenn zB das GUI in Zeile 30 aufgerufen wird, dieses erst ausgefüllt und bestätigt wird und dann der Rest des .m Files abgearbeitet wird?

Wie kann ich, wenn ich ein GUI mit Edit Boxen habe, wo der Nutzer Werte einträgt, einen OK Button nutzen, um dann die Werte der Editboxen in die Variablen zu schreiben? Momentan müsste man in jeder Box noch Enter drücken... das ist etwas umständlich.


Mmmartina
Forum-Meister

Forum-Meister


Beiträge: 745
Anmeldedatum: 30.10.12
Wohnort: hier
Version: R2020a
     Beitrag Verfasst am: 11.12.2012, 12:29     Titel:
  Antworten mit Zitat      
aus dem ersten m-file rufst du das m-file auf, in welchem deine GUI beschrieben wird.
innerhalb der opening function musst du der GUI nun sagen, dass sie warten soll. Und zwar so lange bis eine definierte Rückgabe (z.B. OK-Button) erfolgt innerhalb der Rückgabefunction des GUI-m-files.
Code:

function *fctName*_OpeningFcn(hObject, eventdata, handles, varargin)

[...]

uiwait(handles.*GUIHandle*)

function *name*_OutputFcn (...)
[...]
uiresume(handles.*GUIHandle*);
 

_________________

LG
Martina

"Wenn wir bedenken, daß wir alle verrückt sind, ist das Leben erklärt." (Mark Twain))
Private Nachricht senden Benutzer-Profile anzeigen
 
marc-205

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.12.2012, 13:20     Titel:
  Antworten mit Zitat      
Vielen dank schonmal für die Antwort.

Mit "*GUIHandle* hast du den Namen des m-files gemeint, oder? (die heißt bei mir koordinaten_gui.m)
Die opening function sieht dann so aus
Code:
function koordinaten_gui_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to koordinaten_gui (see VARARGIN)

% Choose default command line output for koordinaten_gui
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
uiwait(handles.koordinaten_gui)
 


allerdings kommt im Workspace beim ausführen sofort ne Fehlermeldung:
Code:
Reference to non-existent field 'koordinaten_gui'.

Error in koordinaten_gui>koordinaten_gui_OpeningFcn (line 59)
uiwait(handles.koordinaten_gui)

Error in gui_mainfcn (line 221)
    feval(gui_State.gui_OpeningFcn, gui_hFigure, [], guidata(gui_hFigure), varargin{:});

Error in koordinaten_gui (line 42)
    gui_mainfcn(gui_State, varargin{:});


Ich verstehe nicht, was sich dabei worauf bezieht und welche Bezeichnung wo hin kommt...

Wie kann ich mit so einem Pushbutton denn irgendeine Funktionalität einbauen, die dann eine Auswirkung auf dieses uiresume hat?
Habe im GUIDE eine KeyPressFcn hinzugefügt, verstehe aber nicht, wo ich da nun sagen kann, was dann passieren soll, wenn man da drauf drückt.
 
Mmmartina
Forum-Meister

Forum-Meister


Beiträge: 745
Anmeldedatum: 30.10.12
Wohnort: hier
Version: R2020a
     Beitrag Verfasst am: 11.12.2012, 15:49     Titel:
  Antworten mit Zitat      
marc-205 hat Folgendes geschrieben:
Vielen dank schonmal für die Antwort.

Mit "*GUIHandle* hast du den Namen des m-files gemeint, oder? (die heißt bei mir koordinaten_gui.m)


Das m-file für die Gui hat den gleichen Namen wie die zu öffnende GUI selber! Überprüfe das und ändere es ggf.
Im m-file wird ein "initialisation code" automatisch erstellt von Matlab, ebenso die opening und close function.

marc-205 hat Folgendes geschrieben:

Die opening function sieht dann so aus
Code:
function koordinaten_gui_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to koordinaten_gui (see VARARGIN)

% Choose default command line output for koordinaten_gui
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
uiwait(handles.koordinaten_gui)
 


Warum willst du den handle deines Objektes (=deiner Gui) als Output zurückgeben?
Übergibst du irgendetwas vom ersten m-file an deine GUI? Wenn ja, steht das in varargin.

marc-205 hat Folgendes geschrieben:

allerdings kommt im Workspace beim ausführen sofort ne Fehlermeldung:
Code:
Reference to non-existent field 'koordinaten_gui'.

Error in koordinaten_gui>koordinaten_gui_OpeningFcn (line 59)
uiwait(handles.koordinaten_gui)

Error in gui_mainfcn (line 221)
    feval(gui_State.gui_OpeningFcn, gui_hFigure, [], guidata(gui_hFigure), varargin{:});

Error in koordinaten_gui (line 42)
    gui_mainfcn(gui_State, varargin{:});


Ich verstehe nicht, was sich dabei worauf bezieht und welche Bezeichnung wo hin kommt...

Wie heißt denn der Handle deiner GUI?
setz mal einen breakpoint innerhalb der opening function und laß dir mal die handles ausgeben (handles markieren und F9 drücken). der oberste handle müsste der der Gui sein.

Ganz bildlich gesprochen: deine GUI besteht aus einzelnen Elementen, die alle einen Namen haben. Der Name setzt sich aus handles + . + NAME zusammen.
Wenn du den falschen NAmen nutzt, sprichst du das falsche Element an. Vermutlich heißt der handle deiner Gui anders, daher der Fehler.

marc-205 hat Folgendes geschrieben:

Wie kann ich mit so einem Pushbutton denn irgendeine Funktionalität einbauen, die dann eine Auswirkung auf dieses uiresume hat?
Habe im GUIDE eine KeyPressFcn hinzugefügt, verstehe aber nicht, wo ich da nun sagen kann, was dann passieren soll, wenn man da drauf drückt.

Du erstellt im GUIDE einfach einen Button in der Gui. Der Funktionskopf wird ganz automatisch im m-file erstellt.
Innerhalb dieser Funktion ließ du dann einfach Werte aus der Gui aus (mit get(handle...,...). Und dann weißt du das z.B. handles.output zu.
Als letzte Zeile innerhalb dieser Funtion kommt dann ein uiresume(...)
_________________

LG
Martina

"Wenn wir bedenken, daß wir alle verrückt sind, ist das Leben erklärt." (Mark Twain))
Private Nachricht senden Benutzer-Profile anzeigen
 
marc-205

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.12.2012, 10:21     Titel:
  Antworten mit Zitat      
Zitat:
Warum willst du den handle deines Objektes (=deiner Gui) als Output zurückgeben?
Übergibst du irgendetwas vom ersten m-file an deine GUI? Wenn ja, steht das in varargin.

Warum das dort steht, kann ich dir nicht beantworten. Das hat Matlab bzw Guide selbst so geschrieben. Ich wollte zumindest nichts aus dem m-file an das GUI übergeben.


Der Handle hat viele Unterpunkte:
Code:
handles.output = hObject

handles =

        figure1: 173.0024
       uipanel1: 174.0024
    pushbutton2: 215.0024
         text21: 214.0024
         text20: 213.0024
         edit20: 212.0024
         edit19: 211.0024
         text19: 210.0024
         text18: 209.0024
         edit18: 208.0024
         edit17: 207.0024
         text17: 206.0024
         text16: 205.0024
         edit16: 204.0024
         edit15: 203.0024
         text15: 202.0024
         text14: 201.0024
         edit14: 200.0024
         edit13: 199.0024
         text13: 198.0024
         text12: 197.0024
         edit12: 196.0024
         edit11: 195.0024
         text11: 194.0024
         text10: 193.0024
         edit10: 192.0024
          edit9: 191.0024
          text9: 190.0024
          text8: 189.0024
          edit8: 188.0024
          edit7: 187.0024
          text7: 186.0024
          text6: 185.0024
          edit6: 184.0024
          edit5: 183.0024
          text5: 182.0024
          text4: 181.0024
          edit4: 180.0024
          edit3: 179.0024
          text2: 178.0024
          text1: 177.0024
          edit2: 176.0024
          edit1: 175.0024
         output: 173.0024


habe mal figure1 als Namen benutzt und jetzt zumindest nicht mehr die Fehlermeldungen zu dem uiwait:
Code:
Error using feval
Undefined function 'pushbutton2_CreateFcn' for input arguments of type 'double'.

Error in gui_mainfcn (line 96)
        feval(varargin{:});

Error in koordinaten_gui (line 42)
    gui_mainfcn(gui_State, varargin{:});

Error in
@(hObject,eventdata)koordinaten_gui('pushbutton2_CreateFcn',hObject,eventdata,guidata(hObject))

 
Error using struct2handle
Error while evaluating uicontrol CreateFcn


Ein Teil der Fehermeldungen kommt wahrscheinlich daher, dass ich nicht weiß, wie oder wo ich dieses uiresume hinschreibe. Hab zwar von diesem Pushbutton eine KeyPressFcn aber keine Ahnung, welches handle man da reinschreibt. Ist das wieder dieses figure1, oder ein handle, was quasi der Button ist?

Das herausschreiben der im GUI einzugebenden Werte in die Variablen im Workspace hab ich mit assignin gemacht, wo aber wie gesagt jeweils wieder die Enter-Taste nötig ist. Diese "Bestätigung" für alle Edit Felder zum schreiben in den Workspace würd ich gern mit dem Button machen. Idealerweise sollte der dann auch dieses uiresume anschließend ausführen.

Hab die Datei mal angehangen.

Sorry für die Planlosigkeit, aber ich nutze Matlab erst seit letzter Woche und habe leider vorher noch nie was mit Programmieren am Hut gehabt.
Vielen dank schonmal für die Hilfe.

koordinaten_gui.m
 Beschreibung:

Download
 Dateiname:  koordinaten_gui.m
 Dateigröße:  22.76 KB
 Heruntergeladen:  407 mal
 
Mmmartina
Forum-Meister

Forum-Meister


Beiträge: 745
Anmeldedatum: 30.10.12
Wohnort: hier
Version: R2020a
     Beitrag Verfasst am: 12.12.2012, 11:37     Titel:
  Antworten mit Zitat      
Wenn du noch gar keine AHnung zu den Handles hast, dann such dir bitte erstmal eine einfach Programmiererkläung zu den GUIs und arbeite dieses Schritt für Schritt durch.
Davon gibt es massig im Netz, einfach mal google bemühen.

Alles andere wird dir keinen bleibenden Nutzen bringen, sondern ein frustrierendes stochern im Nebel, weil die Grundlagen fehlen.
_________________

LG
Martina

"Wenn wir bedenken, daß wir alle verrückt sind, ist das Leben erklärt." (Mark Twain))
Private Nachricht senden Benutzer-Profile anzeigen
 
marc-205
Forum-Anfänger

Forum-Anfänger


Beiträge: 25
Anmeldedatum: 12.12.12
Wohnort: ---
Version: R2010b
     Beitrag Verfasst am: 12.12.2012, 15:14     Titel:
  Antworten mit Zitat      
Hallo.

Ich habe mich natürlich auch in Google ausgetobt und gesucht, aber erst spät brauchbare Erklärungen zu den Handles gefunden, bzw diese verstanden.

Anscheinend kann innerhalb des GUI m-files über handles.Tag der Wert der Variable aus den jeweiligen Feldern, zB Editboxen, ausgelesen (und auch hineingeschrieben) werden, wobei für "Tag" der jeweilige Tag des Feldes genommen wird. Es sind also quasi lokale Variablen, die nur im GUI zur Verfügung stehen, die automatisch durch das erstellen von den jeweiligen Feldern vergeben/deklariert werden.

Das schreiben der jeweiligen Werte (in dem fall will ich die Variable im WS x_o nennen und ziehe sie aus der Edit Box mit dem Tag "edit1" raus) in den Workspace mit folgendem Code, muss in die Callback Funktion des Push Buttons geschrieben werden.
Code:
x_o=str2num(get(handles.edit1, 'String'))
assignin('base', 'x_o', x_o)

Das hatte ich fälschlicherweise zunächst in eine KeyPressFcn geschrieben, muss aber für jeden Wert in die Callback des Buttons geschrieben werden.

Das funktioniert soweit schonmal.

Das Problem, dass das m-file, was die GUI aufruft, nicht auf diese gewartet hat, habe ich jetzt gelöst, indem ich in die Output Function einen waitfor Befehl eingefügt habe
Code:
waitfor(handles.pushbutton2)

Also wird das abgeschlossen/ausgegeben, wenn der pushbutton 2 geklickt wird.

Das klappt soweit auch alles. Allerdings kommen im Workspace weiterhin folgende Fehlermeldungen, obwohl das m-File und auch die GUI korrekt abgearbeitet werden.
Code:
??? Error using ==> feval
Undefined function or method 'pushbutton2_CreateFcn' for input arguments of type
'double'.

Error in ==> gui_mainfcn at 96
        feval(varargin{:});

Error in ==> koordinaten_gui at 42
    gui_mainfcn(gui_State, varargin{:});

Error in ==>
@(hObject,eventdata)koordinaten_gui('pushbutton2_CreateFcn',hObject,eventdata,guidata(hObject))

 
??? Error using ==> struct2handle
Error while evaluating uicontrol CreateFcn

 


Anscheinend hat das war mit der varargin Sache zu tun. Das Programm läuft soweit, daher ists nicht so schlimm, aber ich würd gern verstehn, was das für Fehler sind.
Die aktuelle Datei hab ich nochmal angehangen.

koordinaten_gui.m
 Beschreibung:

Download
 Dateiname:  koordinaten_gui.m
 Dateigröße:  25.91 KB
 Heruntergeladen:  401 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
marc-205
Forum-Anfänger

Forum-Anfänger


Beiträge: 25
Anmeldedatum: 12.12.12
Wohnort: ---
Version: R2010b
     Beitrag Verfasst am: 05.02.2013, 13:46     Titel:
  Antworten mit Zitat      
Hallo,

ich habe die hier oben benannten Probleme gelöst, aber jetzt ein neues.
Ich habe ein GUI, in dem 2 Buttons sind, mit denen ich jeweils ein anderes Unterprogramm aufrufen will. Die beiden Unterprogramme liegen jeweils in einem eigenen Ordner. Also hab ich in den Pushbutton Callback geschrieben
Code:
cd Unterordnername
close(gcbf)
unterprogramm


Wenn ich darauf klicke wird das Unterprogramm auch ausgeführt, das zu dem Unterprogramm gehörende GUI öffnet sich. Wenn ich in diesem GUi dann nach meinen Eingaben die Berechnung starten will, kommt im Command Window die Fehlermeldung
Code:
Undefined function or variable 'x_o'.
Dabei handelt es sich um die Variablen, die ich in den GUIs des jeweiligen Unterprogramms mit assignin in den base Workspace geschrieben habe. Im Workspace werden die auch angezeigt, also sind sie vorhanden und mit den gewünschten Werten belegt. Warum kann er dann nicht mit den Werten weiterrechen?
Ich glaube ich muss in dem ersten GUI irgendwas schreiben, damit nachdem auf den pushbutton geklickt wurde, wieder mit dem normalen base Workspace gearbeitet wird. Ich weiß allerdings nicht wie das geht, oder ob das überhaupt geht.


Wenn ich die Unterprogramme direkt ausführe, also ohne die "obere" GUI klappt alles problemlos.

Hat jemand eine Idee?
Private Nachricht senden Benutzer-Profile anzeigen
 
marc-205
Forum-Anfänger

Forum-Anfänger


Beiträge: 25
Anmeldedatum: 12.12.12
Wohnort: ---
Version: R2010b
     Beitrag Verfasst am: 13.02.2013, 09:28     Titel:
  Antworten mit Zitat      
Hat niemand eine Idee?
Wäre für eine hilfreiche Idee sehr dankbar.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 13.02.2013, 14:09     Titel:
  Antworten mit Zitat      
Hallo marc-205,

Bitte poste eine neue Frage in einem neuen Thema. Andernfalls ist der "beantwortet"-Status sinnfrei und die Diskussion sehr unübersichtlich. Danke.

Variablen per ASSIGNIN in andere Workspaces zu "schummeln" ist einfach eine ausgesprochen unübersichtliche Method. Darum wundert es mich nicht, dass dies Probleme erzeugt. Besser ist es, eine Variable per SETAPPDATA oder GUIDATA im Figure-Objekt zu speichern, oder eine spezielle Funktion zu benutzen, die die Werte als PERSISTEN Variablen zwischenspeichert.

Das Ändern des aktuellen Ordners um bestimmte M-Files zu erreichen, ist ebenfalls uneffizient und sehr anfällig für Probleme. Besser wäre es, die Ordner im PATH einzutragen, entweder mit dem PATHTOOL oder dynamisch per ADDPATH.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
marc-205
Forum-Anfänger

Forum-Anfänger


Beiträge: 25
Anmeldedatum: 12.12.12
Wohnort: ---
Version: R2010b
     Beitrag Verfasst am: 20.02.2013, 12:52     Titel:
  Antworten mit Zitat      
Hallo Jan,
vielen Dank für deine Antwort.
Ich hatte den Status dieses Themas in "Rückfrage" geändert. Das hatte ich für übersichtlich genug gehalten.

Hm, ich wollte es bisher ehrlichgesagt vermeiden, sehr tief in die GUI Programmierung einzusteigen, weil ich bisher noch nie irgendetwas programmiert habe. Daher der Versuch mit assignin.

Die GUI ist auch nur dazu da, um eine grafische Oberfläche zu haben in der die Variablen mit den Startwerten belegt werden. Das ist die einzige Funktion und Bedeutung der GUI in diesem Fall. Die eigentliche Rechnung steht in .m Files die ausgeführt werden, wenn die Variablen ihre Werte haben.

Daher werde ich es wohl so lassen wie es ist und damit leben, dass ich die beiden Unterprogramme jeweils "manuell" aufrufen muss und es nicht mit einem Button einer GUI geht.
Trotzdem vielen Dank!
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.