Creazione di una gui dati diversi script

di il
13 risposte

Creazione di una gui dati diversi script

Buonasera a tutti, avrei bisogno del vostro prezioso aiuto! Ho creato diversi script che vorrei confluissero in una gui per automatizzare tutto.
Vorrei una gui con 3 checkbox che richiamino 3 script diversi che mi diano in uscita dei plot creati in ogni script.Poi vorrei un pulsante chiamato numeropuntitot che è dato da uno script chiamato calcolapunti. Ho messo il pushbutton e a destra una textbox che deve dare il numero di punti calcolati nello script calcolapunti. Poi vorrei una casella di input che in base al numero che si digita richiama uno script che riceve in ingresso un input e dà in uscita tre plot:plot1,plot2,plot3.
potreste gentilmente aiutarmi?Grazie mille!!!!

13 Risposte

  • Re: Creazione di una gui dati diversi script

    Il modo più semplice per creare una GUI è usare il tool GUIDE che si apre digitando il comando "guide" dalla Command WIndow.

    Una volta aperto, selezionare "Create New GUI"

    GUIDE appare quindi così:

    tool_guide.jpg
    tool_guide.jpg

    Sulla toolbar a sinistra sono disponibili gli oggetti (uicontrols) che si possono inserire nella GUI (pushbuttons, check box, ...)

    Si costruisce quindi la GUI posizionando gli uicontrol nella canvas (l'area a sistra della toolbar)

    Con un doppio click su un uicontrol apre la finestra nella quale se ne possono modificare le proprietà.

    Una proprietà importante è "Tag": identifica il "nome" dell'uicontrol.

    Un'altra proprietà notevole è "Unit": settata "Normalized" ed in abbinamento con la proprietà "Resize" della "figure" (il pannello relativo si apre con doppio click in un punto della canvas nel quale non ci sono uicntrols) settata "on" consente di modificare le dimensioni della finesta (della GUI) in modo che le dimensioni degli uicontrols si adattino automaticamente.

    Una terza è "String" che definisce la stringa che comparirà sull'uicontrol (es. la stringa che compare sul pushbutton)

    Salvando la GUI creata viene generato un file ".fig" che contiene essenzialmente le informazioni grafiche ed un file ".m" che contiene la funzione che, lanciata dalla Command WIndow "aprirà" la GUI.

    In base a quanto riportato nella domanda:

    multi_plot.jpg
    multi_plot.jpg

    La GUI, lanciata dalla Command Window ha il seguente aspetto:

    multi_plot_1.jpg
    multi_plot_1.jpg

    Una volta creata l'interfaccia grafica si passa alla definizione delle callbacks (le azioni che devono essere eseguire quando, ad esempio, si preme un pushbutton (in pratica, gli script che devono essere eseguiti)

    Per fare questo si deve aprire il file ".m" generato automaticamente dal tool GUIDE.

    In base alla GUI creata:
    
    function varargout = multi_plot_gui(varargin)
    % MULTI_PLOT_GUI MATLAB code for multi_plot_gui.fig
    %      MULTI_PLOT_GUI, by itself, creates a new MULTI_PLOT_GUI or raises the existing
    %      singleton*.
    %
    %      H = MULTI_PLOT_GUI returns the handle to a new MULTI_PLOT_GUI or the handle to
    %      the existing singleton*.
    %
    %      MULTI_PLOT_GUI('CALLBACK',hObject,eventData,handles,...) calls the local
    %      function named CALLBACK in MULTI_PLOT_GUI.M with the given input arguments.
    %
    %      MULTI_PLOT_GUI('Property','Value',...) creates a new MULTI_PLOT_GUI or raises the
    %      existing singleton*.  Starting from the left, property value pairs are
    %      applied to the GUI before multi_plot_gui_OpeningFcn gets called.  An
    %      unrecognized property name or invalid value makes property application
    %      stop.  All inputs are passed to multi_plot_gui_OpeningFcn via varargin.
    %
    %      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
    %      instance to run (singleton)".
    %
    % See also: GUIDE, GUIDATA, GUIHANDLES
    
    % Edit the above text to modify the response to help multi_plot_gui
    
    % Begin initialization code - DO NOT EDIT
    gui_Singleton = 1;
    gui_State = struct('gui_Name',       mfilename, ...
                       'gui_Singleton',  gui_Singleton, ...
                       'gui_OpeningFcn', @multi_plot_gui_OpeningFcn, ...
                       'gui_OutputFcn',  @multi_plot_gui_OutputFcn, ...
                       'gui_LayoutFcn',  [] , ...
                       'gui_Callback',   []);
    if nargin && ischar(varargin{1})
        gui_State.gui_Callback = str2func(varargin{1});
    end
    
    if nargout
        [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
    else
        gui_mainfcn(gui_State, varargin{:});
    end
    % End initialization code - DO NOT EDIT
    
    
    % --- Executes just before multi_plot_gui is made visible.
    function multi_plot_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 multi_plot_gui (see VARARGIN)
    
    % Choose default command line output for multi_plot_gui
    handles.output = hObject;
    
    % Update handles structure
    guidata(hObject, handles);
    
    % UIWAIT makes multi_plot_gui wait for user response (see UIRESUME)
    % uiwait(handles.figure1);
    
    
    % --- Outputs from this function are returned to the command line.
    function varargout = multi_plot_gui_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} = handles.output;
    
    
    % --- Executes on button press in Plot_1.
    function Plot_1_Callback(hObject, eventdata, handles)
    % hObject    handle to Plot_1 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    % Hint: get(hObject,'Value') returns toggle state of Plot_1
    
    
    % --- Executes on button press in Plot_2.
    function Plot_2_Callback(hObject, eventdata, handles)
    % hObject    handle to Plot_2 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    % Hint: get(hObject,'Value') returns toggle state of Plot_2
    
    
    % --- Executes on button press in Plot_3.
    function Plot_3_Callback(hObject, eventdata, handles)
    % hObject    handle to Plot_3 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    % Hint: get(hObject,'Value') returns toggle state of Plot_3
    
    
    % --- Executes on button press in numeropuntitot.
    function numeropuntitot_Callback(hObject, eventdata, handles)
    % hObject    handle to numeropuntitot (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    
    
    function edit1_Callback(hObject, eventdata, handles)
    % hObject    handle to edit1 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    % Hints: get(hObject,'String') returns contents of edit1 as text
    %        str2double(get(hObject,'String')) returns contents of edit1 as a double
    
    
    % --- Executes during object creation, after setting all properties.
    function edit1_CreateFcn(hObject, eventdata, handles)
    % hObject    handle to edit1 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    empty - handles not created until after all CreateFcns called
    
    % Hint: edit controls usually have a white background on Windows.
    %       See ISPC and COMPUTER.
    if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
        set(hObject,'BackgroundColor','white');
    end
    
    
    % --- Executes on button press in Run_3_plot.
    function Run_3_plot_Callback(hObject, eventdata, handles)
    % hObject    handle to Run_3_plot (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    
    % --- Executes on button press in Plot_sel.
    function Plot_sel_Callback(hObject, eventdata, handles)
    % hObject    handle to Plot_sel (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    
    % --- Executes when uipanel2 is resized.
    function uipanel2_ResizeFcn(hObject, eventdata, handles)
    % hObject    handle to uipanel2 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    Le callback associate a ciascun uicontrol sono identificate in base alla stringa assegnata alla proprietà "Tag" (vedi sopra):

    Es. al pushbutton "3 Plot" è stata associato i Tag "Run_3_plot" per cui la callback nel file ".m" sarà:
    "function Run_3_plot_Callback(hObject, eventdata, handles)"
    qui va inserito il codice eseguire quando verrà prenuto il pushbutton; il codice può essere scritto direttamente o si può inserire il nome del file ".m" nel quale è stato precedentemente scritto (come sembra essere nel caso della domanda).

    Per verificare lo "stato" di uicontrols come ad esempio gli "checkbox" si può utilizzare il relativo handle che è disponibile all'interno della strutture "handles" (che è uno dei parametri passato a tutte le funzioni - vedi sopra).
    "handles" è una struttura che contiene, tra gli altri, gli handles dei vari uicontrols che sono stati inseriti.
    Tramite essi si accede alle proprietà degli uiocontrol stessi: ad esempio, per verificare se un checkbos è stato selezionato:

    get(handles.Plot_1,'value')

    Nella GUI è stato inserito un solo sistema di assi cartesiani, dalla domanda non è chiaro se i vari plot richiesti debbano essere effettuati in un unico grafico (hold on) od in assi diversi (ad esempio "subplot").
    Nel secondo caso, nel costruire la GUI dovranno essere definiti "n" assi cartesiani (tramite la toolbar alla sinistra del tool GUIDE.

    L'help di MatLab (doc guide) contiene dettagliate in formazioni sulla creazione e gestione delle GUI, altre informazioni es esempi si possono trovare facilmente in Internet.

    Hope this helps.
  • Re: Creazione di una gui dati diversi script

    Buongiorno, grazie mille per la dettagliata spiegazione!Il mio problema è che devo associare ai button delle variabili che ho in uscita dagli script.Per esempio:quando spingo il pulsante num punti devo fare andare in uscita il valore associato alla variabile numero punti nello script calcola punti.Come lo associo?Grazie mille!!!
  • Re: Creazione di una gui dati diversi script

    Una volta creta l'interfaccia grafica con GUIDE bisogna lavorare sulle callbacks definite nel file ".m" generato automaticamente da GUIDE.

    Per ogni uicontrol viene generata una funzione "callback" il nome della quale è:

    function <Tag>_Callback(hObject, eventdata, handles)

    dove <Tag> è la stringa che è stata associata allo uicontrol (vedi risposta precedente).
    Ad esempio: la funzione callback associata al pushbutton "Numero Punti" è:

    function numeropuntitot_Callback(hObject, eventdata, handles)

    poichè, tramite GUIDE la proprietà "Tag" del pushbutton è stata posta uguale a " numeropuntitot".

    Con riferimento ai vari uicontrols creati nella GUI ed alle domande poste:

    [*] Vorrei una gui con 3 checkbox che richiamino 3 script diversi che mi diano in uscita dei plot creati in ogni script.

    Potrebbe essere utile prima settare quale dei tre grafici plottare spuntando le relative checkboxes e poi premere il pushbutton "Plot Selez." per attivare il plot.
    Queste attività vanno codificate all'interno della callback associata al pushbutton:

    function Plot_sel_Callback(hObject, eventdata, handles)

    Per identificare quali checkboxes sono stati selezionati:
    
    cb_1=get(handles.Plot_1,'value')
    cb_2=get(handles.Plot_2,'value')
    cb_3=get(handles.Plot_3,'value')
    
    cb_1, cb_2 e cb_3 saranno settati a 1 se il corrispondente checkbox è stato selezionato, 0 in caso contrario.
    Una volta acquisiti questi valori si può, per esempio, chiamare gli script che generano i relativi plot (questi script, mi sembra di aver capito, sono già stati scrtti):
    
    if(cb_1)
       script_1
    end
    if(cb_2)
       script_2
    end
    if(cb_3)
       script_3
    end
    
    [*] Poi vorrei un pulsante chiamato numeropuntitot che è dato da uno script chiamato calcolapunti.
    Ho messo il pushbutton e a destra una textbox che deve dare il numero di punti calcolati nello script calcolapunti.


    Anche in questo caso si può lavorare sulla callback collegata al pushbutton

    function numeropuntitot_Callback(hObject, eventdata, handles)

    all'interno della funzione si invoca lo script che calcola i numero dei punti (anche questo dovrebbe essere già stato scritto)
    Questo script dovrebbe definire il numero di punti, supponiamo nella variabile "numero_punti".
    Per scrivere questo numero nella casella di testo a destra del pushbutton bisogna identificare l'handle della casella di testo.
    L'handle avrà come nome il Tag assegnato alla casella quando è stata creata con GUIDE; nel caso specifico, "text1"
    Per assegnare la stringa alla casella bisogna prima convertire il valore numerico della variabile "numero_punti" in una stringa:

    set(handles.text1,num2str(numero_punti))

    [*]Poi vorrei una casella di input che in base al numero che si digita richiama uno script che riceve in ingresso un input e dà in uscita tre plot:plot1,plot2,plot3.

    Questo requisito non è molto chiaro.
    Ad ogni modo, se si scrive qualcosa (in questo caso un numero) in una casella di testo, per "estrarlo" ed utilizzarlo bisogna, come sempre, utilizzare l'handle dello uicontrol, in questo caso quello identificato dal Tag "edit1"
    Il numero viene letto dalla casella di testo come una stringa per cui va poi convertito in "numero"

    str=get(handles.edit1,'string')
    num=str2num(str)

    Anche in questo caso queste istruzioni vanno inserite nella callback relativa al pushbutton, che viene identificato, come sempre, tramite il suo handle.

    function Plot_3_Callback(hObject, eventdata, handles)

    Una volta acquisito il numero si può inserire la chiamata alla script che genera i 3 plot

    [*] quando spingo il pulsante num punti devo fare andare in uscita il valore associato alla variabile numero punti nello script calcola punti

    Per quanto riguarda l'ultima domanda, sinceramente non ho capito bene cosa si voglia fare e quanto questo sia diverso da quanto richiesto in precedenza.

    Ad ogni modo, in termini generali, le cose fondamentali sono:

    [*] handles dei vari uicontrols: sono definiti nella variabile di tipo struct che viene passata ad ogni callbck (il terzo parametro di input).
    Se si inserisce in break point in una qualunque callback, si può vedere il contenuto della struttura (es. selezionare "handles" poi premere F9: nella Command Window verrà scritta la lista dei campi della struttura.

    [*]]Le informazioni contenute nei vari uicontrols sono accessibili tramite le "proprietà" degli stessi (es. "Value", "String").
    Queste sono accessibili tramithe gli handles (vedi esempi precedenti).

    [*] Funzioni callback: sono quelle nelle quali va scritto il codice (od il nome dello script ".m" che lo contiene).

    Hope this helps.
  • Re: Creazione di una gui dati diversi script

    Ciao!!!Grazie mille per la risposta!!!Funziona!!!Ma ora ho un altro piccolo problema:ho uno script in cui ho una variabile M che riceve in ingresso un input da tastiera (un numero), il quale mi dà in uscita un plot. Come associo l'input da tastiera al pulsante?Grazie mille!!!
  • Re: Creazione di una gui dati diversi script

    Vorrei riprendere ciò che ho chiesto prima:l'input da tastiera dipende dalla variabile numero punti. Numero punti varia in base al file di ingresso. Come faccio a passare un vettore dinamico al pulsante?Il vettore sarebbe dato dai numeri compresi tra 1 e numero punti.Grazie!!!!!
  • Re: Creazione di una gui dati diversi script

    Per quanto riguarda la prima domanda, ci sono almeno tre modi:

    Primo metodo: nella callback associata al pushbutton si può inserire direttamente la chiamata alla funzione "input", es.

    user_input=input('Inserire il dato di input ')

    quando si premerà il pushbutton questa istruzione verrà eseguita, il controllo passerà alla Command Window e l'utente sarà chiamato ad inserire il dato (di default un numero, una stringa se, nell'istruzione "input", dopo la stringa del prompt, si aggiunge l'opzione 's'
    Quando l'utente preme "Enter" all'interno della callback del pushbutton il dato inserito dalla Command Window sarà assegnato alla variabile ("user_input" nel caso dell'esempio di sopra).
    A questo punto l'input inserito dall'utente è "all'interno della GUI" e può essere usato.
    In realtà il dato è "visibile solo all'interno della funzione callback, per renderlo "visibile" anche alle altre funzioni della GUI si può utilizzare la funzione guidata come segue:

    [*] nella callback nella quale il dato viene generato[/b] ("figure1" è il Tag assegnato alla "finestra" della GUI):
    
    %
    % Creazione di una copia degli handles della figura (GUI) 
    %
    gui_my_data=guidata(handles.figure1);
    %
    % Aggiunta di un camp alla struttura "gui_my_data" ed assegnazione ad esso del valore inserito dall'utente tramite tastiera
    %
    gui_my_data.u_input=user_input;
    %
    % Aggiornamento degli handles della GUI
    %
    guidata(handles.figure1,gui_my_data)
    
    [*] In una qualunque callback, per estrarre il valore inserito:[/b]
    %
    % Estrazione del dato dalla struttura handles
    %
    input_utente=handles.u_input
    
    In una qualunque funzione creata dall'utente ed inserita all'interno del file ".m" della GUI
    La funzione deve essere definita con almeno gli stessi tre parametri delle funzioni create automaticamente dal tool GUIDE (hObject, eventdata, handles) e chiamata, ad esempio in una callback, passandogli in input almeno i tre parametri prima citati
    %
    % Chiamata alla funzione creata dall'utente nella quale si vuole utilizzare il dato inserito da tastiera nella Command Window
    %
    my_fun(hObject, eventdata, handles)
    
    %
    % Definizione della funzione inserita dall'utente
    %
    function my_fun(hObject, eventdata, handles)
    
    input_utente=handles.u_input
    
    Secondo metodo: utilizzo della funzione "inputdlg"
    La funzione "inputdlg" (vedi help di MatLab per i dettagli) genera una finestra di input nella quale l'utente è chiamato ad inserire l'input (numeri, stringhe, ...).
    A differenza della funzione "input", la funzione "inputdlg" restituisce un "cellarray", nel caso l'utente inserisca un valore (scalare) e lo si voglia convertire da "cellarray" a scalare, si può usare la funzione "cellfun" (vedi help di MatLab per i dettagli):
    % user_input è un cellarray
    user_input=inputdlg('Inserire num')
    % x è uno scalare
    x=cellfun(@str2num,user_input)
    
    A parte questo dettaglio, le modalità di gestione dell'input sono identiche a quelle descritte per il Primo Metodo (utilizzo della funzione "guidata")

    [*] Terzo Metodo: utilizzo di una edit box della GUI[/b]
    In questo caso non ci sarà una richiesta esplicita di input all'utente.
    L'utente dovrà inserire il data in una Editbox il contenuto della quale potrà essere letto, ad esempio, dalla callback associata ad un pushbutton.
    Le modalità di implementazione di questo metodo sono state descritte nelle risposte precedenti.

    Hope this helps.

    Per quanto riguarda la seconda domanda:
    l'input da tastiera dipende dalla variabile numero punti. Numero punti varia in base al file di ingresso. Come faccio a passare un vettore dinamico al pulsante?Il vettore sarebbe dato dai numeri compresi tra 1 e numero punti
    purtroppo non riesco a capire cosa si voglia effettivamente fare.
    Sarebbe utile avere ulteriori informazioni o, meglio ancora, il codice che è stato scritto.
  • Re: Creazione di una gui dati diversi script

    Buonasera!Ho bisogno del vostro aiuto!nella GUI di matlab ho inserito un popupmenu che deve prendere delle stringhe contenute in una variabile di uno script già scritto. Ho messo set(handles.popupmenu1,'String',STRI);In STRI ho preso solo la prima colonna della variabile che ho dichiarato. Quando lancio la gui mi dà questo errore: Reference to non-existent field 'popupmenu1'.
    Perchèèèèè?Mi sembra giusto.Grazie mille!aspetto vostre
  • Re: Creazione di una gui dati diversi script

    Non è chiaro cosa voglia dire o che cosa comporti il fatto che
    In STRI ho preso solo la prima colonna della variabile che ho dichiarato
    (sul perchè, immagino ce ne sia uno).

    Ad ogni modo, l'errore:
    Reference to non-existent field 'popupmenu1'.
    non sembrerebbe legato alla variabile STRI (se così fosse, il messaggio d'errore avrebbe dovuto fare riferimento alla variabile).

    La causa dell'errore sembra legata al modo nel quale è stata implementata la GUI e come / dove è stata inserita l'istruzione set(handles.popupmenu1,'String',STRI).

    Non disponendo del codice sorgente della GUI nè dello script nel quale alla variabile STRI vengono assegnate le stringhe, si possono fare solo delle ipotesi.

    La prima che mi viene in mente (ma potrebbe essere completamente sbagliata) è che il Tag del popup menu non sia "popupmenu1"

    Se pubblicassi il codice nel quale è stata inserita l'istruzione set(handles.popupmenu1,'String',STRI) (dovrebbe essere il file .m della GUI) si potrebbe verificare l'ipotesi e, forse, trovare una soluzione.

    Hope this helps.
  • Re: Creazione di una gui dati diversi script

    Function varargout = prova(varargin)
    % PROVABTO M-file for provabto.fig
    % PROVA, by itself, creates a new PROVA or raises the existing
    % singleton*.
    %
    % H = PROVA returns the handle to a new PROVA or the handle to
    % the existing singleton*.
    %
    % PROVA('CALLBACK',hObject,eventData,handles,...) calls the local
    % function named CALLBACK in PROVA.M with the given input arguments.
    %
    % PROVA('Property','Value',...) creates a new PROVA or raises the
    % existing singleton*. Starting from the left, property value pairs are
    % applied to the GUI before provabto_OpeningFcn gets called. An
    % unrecognized property name or invalid value makes property application
    % stop. All inputs are passed to provabto_OpeningFcn via varargin.
    %
    % *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one
    % instance to run (singleton)".
    %
    % See also: GUIDE, GUIDATA, GUIHANDLES

    % Edit the above text to modify the response to help provabto

    % Last Modified by GUIDE v2.5 28-May-2015 18:16:40

    % Begin initialization code - DO NOT EDIT
    gui_Singleton = 1;
    gui_State = struct('gui_Name', mfilename, ...
    'gui_Singleton', gui_Singleton, ...
    'gui_OpeningFcn', @prova_OpeningFcn, ...
    'gui_OutputFcn', @prova_OutputFcn, ...
    'gui_LayoutFcn', [] , ...
    'gui_Callback', []);
    if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
    end

    if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
    else
    gui_mainfcn(gui_State, varargin{:});
    end
    % End initialization code - DO NOT EDIT


    % --- Executes just before provabto is made visible.
    function prova_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 provabto (see VARARGIN)

    % Choose default command line output for provabto
    handles.output = hObject;

    % Update handles structure
    guidata(hObject, handles);

    % UIWAIT makes provabto wait for user response (see UIRESUME)
    % uiwait(handles.figure1);


    % --- Outputs from this function are returned to the command line.
    function varargout = provabto_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} = handles.output;


    % --- Executes on selection change in popupmenu1.
    function popupmenu1_Callback(hObject, eventdata, handles)
    % hObject handle to popupmenu1 (see GCBO)
    % eventdata reserved - to be defined in a future version of MATLAB
    % handles structure with handles and user data (see GUIDATA)
    % get(handles.pushbutton1,'String');
    % Hints: contents = cellstr(get(hObject,'String')) returns popupmenu1 contents as cell array
    % contents{get(hObject,'Value')} returns selected item from popupmenu1


    % --- Executes during object creation, after setting all properties.
    function popupmenu1_CreateFcn(hObject, eventdata, handles)
    % hObject handle to popupmenu1 (see GCBO)
    % eventdata reserved - to be defined in a future version of MATLAB
    % handles empty - handles not created until after all CreateFcns called

    % Hint: popupmenu controls usually have a white background on Windows.
    % See ISPC and COMPUTER.
    if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
    end


    % --- Executes on button press in pushbutton1.
    function pushbutton1_Callback(hObject, eventdata, handles)
    % hObject handle to pushbutton1 (see GCBO)
    % eventdata reserved - to be defined in a future version of MATLAB
    % handles structure with handles and user data (see GUIDATA)
    dataora; %script
    Data;% variabile dello script
    %s=cellstr([s Data]);
    set(handles.popupmenu1,'String',Data);
    Grazie davvero tanto!
  • Re: Creazione di una gui dati diversi script

    Ho rieseguito il codice che ho postato e ora mi dà questo errore:
    Error using ==> set
    Invalid handle object.

    Error in ==> prova>pushbutton1_Callback at 106
    set(handles.popupmenu1,'String',Data);
    Con il debug entro nello script e in uscita ho il vettore strnga che mi interessa, ma nel set ho problemi, perchè?Grazie!!!
  • Re: Creazione di una gui dati diversi script

    Leggendo lo script sembra che sia l'unione di due script associati a due GUI: prova e provabto; a parte quanto scritto nelle righe di commento all'inizio dello script:
    %PROVABTO M-file for provabto.fig
    : riferimento alla GUI provabto
    % PROVA, by itself, creates a new PROVA or raises the existing
    % singleton*.
    %
    % H = PROVA returns the handle to a new PROVA or the handle to
    % the existing singleton*
    
    : riferimento alla GUI prova

    la funzione "OpeningFcn" sembra riferita alla GUI "provabto" stando a quanto scritto come commento prima della funzione Executes just before provabto is made visible, ma il nome della funzione è riferito a quella che sembra un'altra GUI (prova e non "provabto")
    % --- Executes just before provabto is made visible.
    function prova_OpeningFcn(hObject, eventdata, handles, varargin)
    Visto il nuovo messaggio di errore, si direbbe che siano state fatte delle modifiche alla GUI od al file che viene generato automaticamente (lo script che hai pubblicato).

    Come detto all'inizio, sembra quindi che lo script associato alla GUI sia il "merge" dei files di due GUI prova e provabto.

    Se così fosse, questo potrebbe generare l'errore che hai riscontrato.

    Sono state effettuate delle modifiche al codice rispetto alla versione della domanda precedente?

    Purtroppo senza il file ".fig" non posso effettuare il debug.

    Dovresti mettere un breakpiont nella funzione pushbutton1_Callback nella riga

    set(handles.popupmenu1,'String',Data);

    poi selezionare "handles" e premere F9 se nella CommandWindow viene stampata una lunga lista tipo questa
    
                                 figure1: 173.0039
                               zoom_axis: 13.0040
                                uipanel2: 8.0040
                                big_axes: 3.0040
                              Run_3_plot: 2.0040
    
    vuol dire che la struttura "handles" è "visibile" (buon segno); in caso contrario dovresti ottenere un messaggio di errore.

    Prova poi a selezionare "handles.popupmenu1" e premere F9: nella CommandWindow dovresti vedere qualcosa del tipo:
    
    >> handles.popupmenu1
    ans =
        0.0040
    
    non badare allo specifico numero che ho riportato, l'importante è che compaia un numero.
    Se compare un numero vuol dire che l'handle dell'uicontrol è valido, in caso contrario dovresti ottenere un messaggio di errore (l'uicontrol popuomenu non è riconosciuto dalla all'intenro della GUI).

    La cosa strana è che nello script che hai pubblicato è presente la funzione

    function popupmenu1_CreateFcn(hObject, eventdata, handles)

    questa funzione è generata automaticamente dal tool GUIDE quando costruisci la GUi, per cui l'uicontrol popupmenu1 dovrebbe "esistere".

    Come ho scritto prima, senza il file ".fig" non posso fare io queste prove; stando così le cose, quello che posso suggerirti è:

    [*] verifica quella che a me sembra una duplice GUI: cosa sono prova e provabto
    [*] a mali estremi, estremi rimedi: prova ad aggiungere un nuovo popup menu ... e prova ad associare a questo la stringa Data.

    Hope this helps.
  • Re: Creazione di una gui dati diversi script

    Buongiorno!!!Effettivamente era quello il problema!!!Ho rifatto il tutto e ha funzionato!!!Grazie mille!!!Ora vorrei chiedere un'altra cosa:ho crerato un menù a tendina e vorrei che, cliccando su una voce del menù, si aprisse uno script associato che mi mi dà dei plot.Come posso fare?Grazie per tutto l'aiuto!!!
  • Re: Creazione di una gui dati diversi script

    A questo punto dovresti avere acquisito tutte le conoscenze necessarie per risolvere il problema da solo ...

    Ci hai provato?

    Ad ogni modo, qualche suggerimento:

    [*] quando selezioni un item in un popumenu, alla "property" "Value" dell'uicontrol viene assegnato il valore corrispondente alla posizione dell'elemento selezionato nell'elenco degli elementi (es. se selezioni il terzo elemento nel popup menu, a "Value" verrà assegnato il valore 3)
    [*] si può acquisire il valore contento in "Value" tramite l'handle dell'uicontrol:

    popup_sel_index = get(handles.popupmenu1, 'Value');

    [*] questa acquisizione può essere effettuata, per esempio, nella callback di un pushbutton (in questo caso, l'utente seleziona l'elemento desiderato nel popup menu, poi preme un pushbutto per attivare l'azione da compiere in funzione dell'elemento selezionato, ad esempio il lancio ci uno script)
    [*] a prescindere da dove (in quale callback) l'acquisizione venga effettuata, si dovrebbe creare un blocco "if-elseif-elseif ... else" oppure, meglio, uno "switch" basati sul valore di "Value" (popup_sel_index - nell'esempio sopra riportato) per gestire la risposta alla scelta effettuata. Nel tuo caso potrebbe essere qualcosa del tipo:
    switch popup_sel_index
        case 1
            script_a;
        case 2
            script_b;
        case 3
            script_c;
        case 4
            script_d;
    end
    
    Bisogna poi gestire il grafico generato dai vari script che vengono attivati a seguito della selezione dal popup menu; ci sono diverse possibilità, ad esempio (ma le possibilità possono essere molte di più):

    [*] ogni grafico deve essere plottato in una nuova "figure"
    [*] deve essere creata una sola "figure", tutti i grafici vanno plottati in quella "figure", cancellando quello precedente
    [*] deve essere creata una sola "figure", tutti i grafici vanno plottati in quella "figure", aggiungendoli quelli precedente

    Hope this helps.
Devi accedere o registrarti per scrivere nel forum
13 risposte