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

Skript --> GUI starten --> Daten aus GUI zurück ans S

 

terima
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 17.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.10.2013, 22:11     Titel: Skript --> GUI starten --> Daten aus GUI zurück ans S
  Antworten mit Zitat      
Hallo!

Ich bin neu hier und habe schon einige hilfreiche Beiträge als Gast gelesen, vielen Dank an die engagierten User im Board !!
Leider stehe ich trotzdem noch auf dem Schlauch, auch aus der Matlab-Hilfe und den GUI-Tutorials auf youtube werde ich nicht so richig schlau.

Wahrscheinlich ist das ein reines Anfänger/Syntax-Problem, ich fange gerade erst an für eine Abschlussarbeit mit MATLAB zu arbeiten.
Super Programm, aber man muss eben wissen, wie Wink
Ich hoffe ihr seht über meine Anfänger-Unkenntnis hinweg und könnt mir weiterhelfen.

----------------------------


Jedenfalls hier mein Ansatz:

Ich habe einen Berechnungsalgorithmus, der viel Interaktion mit dem User bedingt.
Es geht u.a. um die Berechnung von Kraftstoffverbräuchen von Bussen auf verschiedenen Buslinien, das nur als Hintergrundinfo.
Die Rechenoperationen und Formeln sind mir alle bekannt. Mein "Problem" ist, dass ich bis jetzt ein Skript geschrieben habe,
das erstmal eine erstellte GUI aufruft. Das klappt auch. Die GUI fragt über Radio-Buttons ab, wieviele Buslinien denn betrachtet werden sollen (siehe Bild).
Nun soll diese Info wieder zurück an das Hauptskript gegeben werden (n_linien), um mit den User-Eingaben zu rechnen bzw. ein neues GUI zu starten (mit weiteren Fragen).
Also in etwa eine solche Reihenfolge:

Skript --> GUI (fragt 1. Bedingung ab) --> GUI schickt Eingaben zurück an Skript --> Berechnungen im Skript
--> Basierend auf den ersten Ergebnissen geht es weiter, entweder neue GUI (mit weiteren Fragen) oder weitere Berechnungen
--> und so weiter.

Ich meine schon rausgelesen zu haben, dass eine GUI eigentlich nur an eine weitere GUI Daten schicken kann, stimmt das?
Ist deswegen mein Ansatz eines Hauptskriptes, dass GUIs und Funktionen je nach Bedarf aufruft und damit weiterarbeitet falsch?
Dieser Ansatz erschien mir irgendwie nachvollziehbar. Meine Vorstellung ist, dass man dieses Hauptskript für den Benutzer später auch ohne MATLAB ausführbar machen kann -
es öffnet sich dann erstmal das erste GUI und so weiter. Die Selbstausführbarkeit ohne MATLAB habe ich in einem Tutorial bez. "deploytool" gesehen.
Ich habe MATLAB Student R2013a - kann es sein, dass ich die Deploy-App für diese Version nicht kaufen kann (finde sie nicht im Shop)?

---------------------------------

Hier das konkrete Problem:

Folgend erstmal der Codeabschnitt der Buttongroup im GUI-.m-file:

Code:
% --- Executes when selected object is changed in anzahl_linien.
function anzahl_linien_SelectionChangeFcn(hObject, eventdata, handles)
% hObject    handle to the selected object in anzahl_linien
% eventdata  structure with the following fields (see UIBUTTONGROUP)
%   EventName: string 'SelectionChanged' (read only)
%   OldValue: handle of the previously selected object or empty if none was selected
%   NewValue: handle of the currently selected object
% handles    structure with handles and user data (see GUIDATA)

if hObject == handles.einebuslinie
    n_linien = 1;
   
elseif hObject == handles.zweibuslinien
    n_linien = 2;
   
elseif hObject == handles.dreibuslinien
    n_linien = 3;
 
elseif hObject == handles.vierbuslinien
    n_linien = 4;
 
elseif hObject == handles.funfbuslinien
    n_linien = 5;

end


Der jeweilige Wert der Variablen "n_linien" soll also zurück in das aufrufende Skript geschickt werden und dort geht es dann mit
Berechnungen etc. weiter. Ist das möglich? Oder sollte ich versuchen, mich von GUI-Funktion zu GUI-Funktion zu "hangeln"
und die Berechnungen in den Funktionen unterbringen?


Sorry, viele viele Fragen =)
Ich danke euch schonmal sehr !!

Beste Grüße,
Kevin

Unbenannt.jpg
 Beschreibung:
Ansicht GUI-Fenster

Download
 Dateiname:  Unbenannt.jpg
 Dateigröße:  21.4 KB
 Heruntergeladen:  725 mal
Private Nachricht senden Benutzer-Profile anzeigen


denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 25.10.2013, 09:27     Titel:
  Antworten mit Zitat      
Hallo

Zitat:
Ich meine schon rausgelesen zu haben, dass eine GUI eigentlich nur an eine weitere GUI Daten schicken kann, stimmt das?

Nein, das stimmt nicht. Es gibt keine Begrenzung.


Code:
Ist deswegen mein Ansatz eines Hauptskriptes, dass GUIs und Funktionen je nach Bedarf aufruft und damit weiterarbeitet falsch?

Nein ist nicht falsch , schaue dir dieses Beispiel an:
http://blogs.mathworks.com/videos/2.....-output-from-a-guide-gui/
Private Nachricht senden Benutzer-Profile anzeigen
 
terima
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 17.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.10.2013, 12:48     Titel:
  Antworten mit Zitat      
Hallo denny,

vielen Dank erstmal für deine Antwort!
Ich habe mir das Video angeschaut und es passt eigentlich sehr gut! Nur leider bekomme ich das trotzdem nicht umgesetzt :-/
Ich schätze mal es liegt daran, dass ich eine Radiobutton-Group nutze und im Video eine Checkbox.

Jedenfalls habe ich versucht das umzusetzen und habe mittlerweile folgende Änderungen:

Code:
% --- Outputs from this function are returned to the command line.
function varargout = auswahl_buslinien_OutputFcn(hObject, eventdata, handles)
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
varargout{1} = get(handles.anzahl_linien,'String');
% The figure can be deleted now
delete(handles.figure1);

---------------------------------------

% --- Executes when selected object is changed in anzahl_linien.
function anzahl_linien_SelectionChangeFcn(hObject, eventdata, handles)
% hObject    handle to the selected object in anzahl_linien
% eventdata  structure with the following fields (see UIBUTTONGROUP)
%   EventName: string 'SelectionChanged' (read only)
%   OldValue: handle of the previously selected object or empty if none was selected
%   NewValue: handle of the currently selected object
% handles    structure with handles and user data (see GUIDATA)

if hObject == handles.einebuslinie
    n_linien = 1;
    hObject = n_linien;
   
elseif hObject == handles.zweibuslinien
    n_linien = 2;
   
elseif hObject == handles.dreibuslinien
    n_linien = 3;
 
elseif hObject == handles.vierbuslinien
    n_linien = 4;
 
elseif hObject == handles.funfbuslinien
    n_linien = 5;

end
 



Es kommt immer eine Fehlermeldung wegen
Code:
varargout{1} = get(handles.anzahl_linien,'String')


Im Video klappt das so, hier vielleicht nicht wegen der Buttongroup?

Viele Grüße,
Kevin
Private Nachricht senden Benutzer-Profile anzeigen
 
terima
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 17.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.10.2013, 19:17     Titel:
  Antworten mit Zitat      
Soooo, mittlerweile habe ich mehr oder weniger geschnallt, wie das mit den handles funktioniert Wink
Die Übergabe eines Handles von der GUI zurück an mein Skript funktioniert jetzt auch.
Dabei habe ich aus dem Video unter anderem folgende Zeile übernommen:

Code:
function varargout = auswahl_buslinien_OutputFcn(hObject, eventdata, handles)
% varargout  cell array for returning output args (see VARARGOUT);

varargout{1} = handles.n_linien;
delete(handles.figure1);


Davor habe ich in einer anderen Funktion (Radiobutton-Feld) die Variable handles.n_linien mit einem Wert belegt.
Im Hauptskript wird dann einfach wie folgt aufgerufen:

Code:
n_linien = auswahl_buslinien


Und ich kann mit dem Wert weiterarbeiten.


-----------------------------------------------------------------------


Und nun geht es weiter in einer neuen GUI, die allerdings diesmal 10 Variablen übergeben soll!
Die GUI habe ich fertig, nur die Übergabe an das Skript klappt nicht so recht. Ich habe die Grundstruktur wie oben angelegt,
nur eben mit mehr Daten. Sieht dann wie folgt aus:

Code:
function varargout = anzahl_haltestellen_OutputFcn(hObject, eventdata, handles)

varargout{1} = handles.output;
% varargout{1} = handles.halten_linie1;
% varargout{2} = handles.halten_linie2;
% varargout{3} = handles.halten_linie3;
% varargout{4} = handles.halten_linie4;
% varargout{5} = handles.halten_linie5;
% varargout{6} = handles.checkbox1;
% varargout{7} = handles.checkbox2;
% varargout{8} = handles.checkbox3;
% varargout{9} = handles.checkbox4;
% varargout{10} = handles.checkbox5;

delete(handles.figure2);



Zuerst habe ich es so versucht, wie noch in den Comment-Zeilen zu sehen ist, aber scheinbar funktioniert das nicht :-/ Wenn ich nun die GUI aufrufe, z.B.

Code:
a = anzahl_haltestellen(n_linien)


kommt immer folgende Fehlermeldung:

Code:
Attempt to reference field of non-structure array.




Wahrscheinlich veraffe ich da was in der Syntax / Variablendefinition. Kann mir vielleicht jemand weiterhelfen?

Ich danke euch Smile !!
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 31.10.2013, 23:17     Titel:
  Antworten mit Zitat      
Hallo

die Fehlermeldung heißt, dass das Feld nicht existiert in
varargout{1} = handles.output;

Abhilfe wäre z.B eine Abfrage, ob das Feld existiert

Code:

function varargout = anzahl_haltestellen_OutputFcn(hObject, eventdata, handles)


varargout = cell(1,nargout);
if isfield(handles, 'halten_linie1')
   varargout{1} = handles.halten_linie1;
end

if isfield(handles, 'halten_linie2')
   varargout{2} = handles.halten_linie2;
end

%usw..
%varargout{1} = handles.output;
% varargout{1} = handles.halten_linie1;
% varargout{2} = handles.halten_linie2;
% varargout{3} = handles.halten_linie3;
% varargout{4} = handles.halten_linie4;
% varargout{5} = handles.halten_linie5;
% varargout{6} = handles.checkbox1;
% varargout{7} = handles.checkbox2;
% varargout{8} = handles.checkbox3;
% varargout{9} = handles.checkbox4;
% varargout{10} = handles.checkbox5;

delete(handles.figure2);

 
Private Nachricht senden Benutzer-Profile anzeigen
 
terima
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 17.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.11.2013, 18:14     Titel:
  Antworten mit Zitat      
Hallo denny,

super vielen Dank !! Habe das mal implementiert, noch Titus` Tip von hier: http://www.gomatlab.de/handles-in-o.....-aktiviert-ist-t2761.html eingebaut
und dadurch schon einmal die Handle-Übergabe in die Output-Funktion zum Laufen gebracht Smile
Nur noch einen Fehler habe ich entdeckt, die noch zwischen mir und einer fehlerfreien Abfolge steht Question


Und zwar: Mit Testwerten habe ich in der Outputfunktion mal

Code:


belegt. Wenn ich das so ohne Semikolon stehen lasse, werden auch im Command-Window beide Werte wie folgt angezeigt:

Code:
varargout = [100]  [200]


Wenn ich aber die GUI wie folgt aufrufe:

Code:
halten_linie_test = anzahl_haltestellen(n_linien)


wird mir immer nur

Code:
halten_linie_test = 100


angezeigt. Auch wenn ich die Variable "halten_linie_test" als "cell" vorher deklariert habe - nach dem Aufruf wird es immer zu einer
"double"-Variable und nimmt nur noch den ersten varargout-Wert aus der GUI rüber. Weiß auch da vielleicht jemand weiter?



Schon einmal 1000 Dank für eure Hilfe Smile !!!!!!!
Beste Grüße,
noob
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 01.11.2013, 21:44     Titel:
  Antworten mit Zitat      
Hallo

hier wäre vielleicht besser die Ausgabe anders zu gestalten, alles in ein Array zu schreiben.

Code:

% statt
varargout{1} = 100
varargout {2} = 200

% in ein Array
varargout{1} = [100, 200]
 


Aber man kann natürlich auch mehrere Ausgabeparameter in Array ausgeben, dazu muss ein Array mit Werten vorinitialisieren

z.B für die Funktion test
Code:


function varargout = test()
varargout{1} = 100
varargout {2} = 200

 


Aufruf wäre dann:
Code:

ausgabe = zeros(1,2)

[ausgabe(:)] = test()

 
Private Nachricht senden Benutzer-Profile anzeigen
 
terima
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 17.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.11.2013, 16:28     Titel:
  Antworten mit Zitat      
Hi denny,

vielen Dank für deine Hilfe !!
Es klappt nun und geht weiter Smile))

Beste Grüße,
K
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 - 2024 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.