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

GUI mit Nested Functions: Werte an BaseWorkspace uebergeben

 

Supertyp
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 85
Anmeldedatum: 09.06.08
Wohnort: ---
Version: R2014a
     Beitrag Verfasst am: 08.10.2014, 16:33     Titel: GUI mit Nested Functions: Werte an BaseWorkspace uebergeben
  Antworten mit Zitat      
Ich verzweifle bald an einer banalen Aufgabe: Ich möchte zu einem vorhandenen Skript eine GUI aufsetzen, die übersichtlich Parameter und Vektoren entgegennimmt. Die mache ich über nested functions mit
Code:

und
Code:

Nach Abschluss der Eingabe sollen die Werte an den Base-Workspace uebergeben und die GUI geschlossen werden.
Das funktioniert auch.
Wenn dann aber das Skript noch weitere Variablen im Base-Workspace anlegen will bekomme ich folgende Fehlermeldung:

Zitat:
Attempt to add "<var_name>" to a static workspace. See MATLAB Programming, Restrictions on Assigning to Variables for details.


Wie kann man den Fehler umgehen? Die GUI ist geschlossen und wird nicht mehr benötigt. Anschliessend benötige ich den Workspace ohne jegliche Einschränkungen für das Skript.
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 08.10.2014, 20:10     Titel:
  Antworten mit Zitat      
Hallo,

ich kann nur raten, evalin und assignin konsequent zu vermeiden, siehe diverse Threads hier dazu.
Zur Verwaltung von Daten in GUIs siehe hier:
http://www.mathworks.de/de/help/mat.....data-among-callbacks.html

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Supertyp
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 85
Anmeldedatum: 09.06.08
Wohnort: ---
Version: R2014a
     Beitrag Verfasst am: 09.10.2014, 08:51     Titel:
  Antworten mit Zitat      
Ich möchte kein Daten in GUIs verwalten, sondern die Daten die das Skript im Workspace erwartet sollen übersichtlich durch eine GUI-Eingabemaske in den Workspace abgelegt werden. Wie kann man das denn ohne assignin und eval machen?
Mein Ziel ist einfach:
GUI
- Werte engegennehmen und in den Workspace schreiben, GUI schliessen
Skript
- Berechnung ausführen und Eergebnisse anzeigen
Private Nachricht senden Benutzer-Profile anzeigen
 
Supertyp
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 85
Anmeldedatum: 09.06.08
Wohnort: ---
Version: R2014a
     Beitrag Verfasst am: 09.10.2014, 14:17     Titel:
  Antworten mit Zitat      
Ist meine Frage zu kompliziert oder zu doof? Bin für jeden Hinweis dankbar! Cool

Harald, ich habe mir den Link angesehn, aber da gehts nur darum Werte innerhalb der GUI oder zwischen 2 GUIS auszutauschen. Oder ich habs nicht verstanden.
Wie kriege ich aber Daten in der Form die ich haben will (Struct) im Workspace abgelegt? Welchen der Wege im Link kann man so umbiegen, das das Ergebnis im Base- Worksapce landet?

Ich kann nicht glauben das es dafür keine Lösung gibt...
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 09.10.2014, 15:08     Titel:
  Antworten mit Zitat      
Hallo,

bitte etwas Geduld ;)
Du kannst in der OutputFcn die gewünschten Ergebnisse sammeln und dann beim Aufruf zurückholen:
http://www.mathworks.com/help/matla.....guide-gui.html#f10-999738

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Supertyp
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 85
Anmeldedatum: 09.06.08
Wohnort: ---
Version: R2014a
     Beitrag Verfasst am: 09.10.2014, 16:21     Titel:
  Antworten mit Zitat      
Okay, also OuputFcn Vielen Dank. Aber das Mathworks-Beispiel ist mir wieder mal zu zu kurz, ich krieg es einfach nicht hin...

Nehmen wir an meine GUI.function heisst "MeineGUI.m" und dort werden die Werte aus Textfeldern entgegen genommen:
Code:

und
Code:
test.wert=5;


Wie kriege ich diese Werte in den Workspace? Mir fehlt einfach so ein ganz konkretes Beispiel.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 09.10.2014, 16:30     Titel:
  Antworten mit Zitat      
Hallo,

ganz unten steht's:
In der MeineGUI_OutputFcn
Code:
varargout{2} = ... % was auch immer du haben willst


Wenn du zwei Argumente zurückhaben willst, dann entsprechend
Code:
varargout{3} = ... % was auch immer du haben willst


Aufruf dann:
Code:
[h, arg1, arg2] = MeineGUI();


Man kann wohl auch bei 1 zu zählen anfangen und dann beim Aufruf das h weglassen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Supertyp
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 85
Anmeldedatum: 09.06.08
Wohnort: ---
Version: R2014a
     Beitrag Verfasst am: 10.10.2014, 13:07     Titel:
  Antworten mit Zitat      
Vielen Dank für deine Bemühungen. Mit dem letzten Vorschlag werden auch nur wieder die definierten Variablen übergeben aber nicht im Workspace abgelegt. Das ist alles nicht das was ich brauche:

1. Benutzer tippt Variable in GUI ein
2. GUI legt Variable unter dem definierten Namen im Workspace ab
3. GUI startet ein Skript das anschliessend ohne Einschränkungen auf den Workspace zugreifen kann

Ich merke das Matlab die direkte Möglichkeit unbedingt verbauen will.
Das Skript erwartet einfach bestimmte Variablen im Workspace und ich möchte am Skript nichts ändern d.h. die GUI soll nur "draufgesetzt" werden mit der Schnittstelle Base-Workspace.
Ich schau mir mal die Möglichkeiten von
Code:
an.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 10.10.2014, 19:51     Titel:
  Antworten mit Zitat      
Hallo,

wenn du ein Skript aus einer GUI heraus startest, dann läuft das Skript meines Wissens im momentanen Workspace, also im Workspace des Callbacks der GUI.
Dann geht es darum, die Daten zwischen den Workspaces der Callback Functions hin- und herzuschieben, womit wieder der von mir gepostete Link relevant wird.

Ich kann nur empfehlen, das Aufrufen von Skripten aus Funktionen zu vermeiden. global, evalin und assignin mögen zwar kurzfristig Probleme lösen, schaffen aber langfristig nur noch mehr Probleme.

Grüße,
Harald
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: 11.10.2014, 12:09     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Ich kann nur empfehlen, das Aufrufen von Skripten aus Funktionen zu vermeiden. global, evalin und assignin mögen zwar kurzfristig Probleme lösen, schaffen aber langfristig nur noch mehr Probleme.

Dem stimme ich ganz herzlich zu!

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Supertyp
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 85
Anmeldedatum: 09.06.08
Wohnort: ---
Version: R2014a
     Beitrag Verfasst am: 13.10.2014, 09:14     Titel:
  Antworten mit Zitat      
Okay, dann eben so: Wie kann man den Workspace einer Function aus der Function als Mat-File abspeichern? Das "save" Command liefert die Fehlermeldung:

Code:
Warning: com.mathworks.hg.peer.HG1FigurePeer@2a719f9e is not serializable
> In can_scan_gui>pbRun at 291
Error using save
Can't write file
D:\Users\bla\Documents\MATLAB\CAN_SCAN_TOOL_GUI\test.mat.
Error in can_scan_gui/pbRun (line 291)
        save test.mat
Error while evaluating uicontrol Callback
Private Nachricht senden Benutzer-Profile anzeigen
 
Supertyp
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 85
Anmeldedatum: 09.06.08
Wohnort: ---
Version: R2014a
     Beitrag Verfasst am: 15.10.2014, 16:48     Titel: Die Dogmatiker hier wird es nicht freuen...
  Antworten mit Zitat      
Ich habe meinen Workaround gefunden. Innerhalb des GUI-Callbacks das Skript nicht so aufrufen:

Code:


sondern so:

Code:
evalin('base','run CodeScript')



Cool
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.