GUI Matlab

di il
4 risposte

GUI Matlab

Ciao! Devo realizzare una GUI Matlab con due textbox (con tag "A" e "B"), un bottone (tag "calcola") e un grafico. La gui deve eseguire un determinato codice e visualizzare il grafico in base ai valori inseriti di A e B.
Ho inserito il codice da eseguire all'interno della funzione calcola_Callback (hObject, eventdata, handles), in cui prima carico una serie di dati da un file di testo .txt, poi prelevo i valori dalle textbox e poi svolgo le operazioni da fare.
Per prelevare i dati dalle textbox uso le seguenti righe di codice:
X=str2num(get(handles.A,'String'));
Y=str2num(get(handles.B,'String'));
Se mando in esecuzione il corrispondente file .m della gui oppure apro la gui in GUIDE e la mando in esecuzione con il tasto "Run figure", la gui funziona, cioè preleva correttamente i dati dalle textbox e traccia il grafico desiderato.
Se invece mando in esecuzione direttamente il file .fig mi da il seguente errore (mappa è il nome del file .fig e .m):
??? Attempt to reference field of non-structure array.

Error in ==> mappa>calcola_Callback at 185
X=str2num(get(handles.A,'String'));

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

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

Error in ==>
@(hObject,eventdata)mappa('calcola_Callback',hObject,eventdata,guidata(hObject))

 
??? Error while evaluating uicontrol Callback
Cosa vuol dire? Come faccio a far funzionare la gui mandando in esecuzione direttamente il file .fig?

Grazie!!!

4 Risposte

  • Re: GUI Matlab

    I file ".fig" non sono pensati per essere utilizzati come "eseguibile" da "lanciare per aprire la GUI; essi contengono per lo più informazioni grafiche (al limite, se la GUI contiene un grafico, è possibile estrarre i dati - es. X, Y - che lo generano).

    Per "lanciare" la GUI bisogna "lanciare" lo script o la funzione (in ogni caso il file ".m") che la genera.

    Una domanda, per quale motivo si vuole "lanciare" la GUI tramite il file ".fig"?

    Hope this helps.
  • Re: GUI Matlab

    Grazie! Non c'è nessun motivo particolare, pensavo ci fosse un modo per lanciare la GUI direttamente dal file .fig, invece non è così!!!
  • Re: GUI Matlab

    Ho un problema con la visualizzazione del grafico in una GUI. Ho un menu pop-up con due scelte A e B: se seleziono la scelta A devo visualizzare un certo grafico, se invece seleziono la scelta B devo visualizzare un messaggio.
    Se seleziono prima la B (messaggio) e poi la A (grafico) non ci sono problemi, cioè il messaggio si visualizza e il grafico no.
    Al contrario, se seleziono prima A (grafico) e poi B (messaggio), il messaggio viene visualizzato e l'handles di tipo axes non è visibile, però comunque rimane memorizzato il grafico precedente.
    Praticamente bisogna fare un clear del grafico penso. Come posso risolvere il problema?
    Scrivo una parte del codice, dove handles.mappa è il grafico e handles.errore il messaggio
    if isempty(R)     % condizione per visualizzare il messaggio
        set(handles.mappa,'Visible','off');
        set(handles.errore,'Visible','on');
    else
        X=-R';        % variabili da visualizzare sul grafico
        Y=-L';
    
        set(handles.errore,'Visible','off');
        set(handles.mappa,'Visible','on');
    
        axes(handles.mappa)
        semilogy(X,Y,'ob','linewidth',2)
        grid on
    end
    
  • Re: GUI Matlab

    Nella domanda

    andrew89 ha scritto:


    Praticamente bisogna fare un clear del grafico penso.
    non è chiaro se si vuole rendere "non visibili" le curve plottate o se si vuole "cancellarle".

    Settando la proprietà "visible" degli assi "off" questi non vengono "cancellati", ma, semplicemente non vengono visualizzati.
    La "visibilità" è però limitata agli assi cartesiani.
    Ogni curva (o altro) plottato all'interno degli assi ha un proprio handle; per rendere "non visibili" le curve occorre settare la proprietà "visible" dei loro rispettivi handle, "off".
    Si può accedere agli handles degli oggetti plottati in diversi modi:

    [*] tramite l'handle restituito dalle funzioni plot, plot3, surf, ecc.

    a=plot(x,y)
    hold on
    b=plot(x,y)
    set(a,'visible','off')
    set(b,'visible','off')

    [*] tramite l'handle degli assi, facendosi restituire gli handles delle curve (children)

    set(get(gca,'children'),'visible','off')

    Per rendere nuovamente visibili i grafici, è sufficiente settare la proprietà "visible", "on"

    Se invece si vogliono "cancellare" i grafici, si può usare la funzione "delete" alla quale vanno dati in input gli handles delle curve stesse; con riferimento agli esempi precedenti:

    delete(a)
    delete(b)

    oppure

    delete(get(gca,'children'))

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