Settaggio di un Parametro inserito nella GUI

di il
16 risposte

Settaggio di un Parametro inserito nella GUI

Ciao a tutti, scusate ma nello scorso post sono stato poco chiaro. Spero di esserlo meglio in questo.

Ho creato questa interfaccia grafica, formata da un "EDIT TEXT", "PUSH BUTTON" e "AXES". La GUI, premendo il pulsante deve far partire uno script, e su questo problemi non ne ho. Voglio solo sapere come faccio a prendere il valore che inserisco sull'EDIT TEXT e utilizzarlo all'interno dello script che devo mandare in esecuzione. Il codice che ho scritto è il seguente, ma mi da errore:
function varargout = prova_GUI(varargin)
% PROVA_GUI MATLAB code for prova_GUI.fig
%      PROVA_GUI, by itself, creates a new PROVA_GUI or raises the existing
%      singleton*.
%
%      H = PROVA_GUI returns the handle to a new PROVA_GUI or the handle to
%      the existing singleton*.
%
%      PROVA_GUI('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in PROVA_GUI.M with the given input arguments.
%
%      PROVA_GUI('Property','Value',...) creates a new PROVA_GUI or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before prova_GUI_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to prova_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 prova_GUI

% Last Modified by GUIDE v2.5 21-Jun-2018 17:40:15

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @prova_GUI_OpeningFcn, ...
                   'gui_OutputFcn',  @prova_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 prova_GUI is made visible.
function prova_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 prova_GUI (see VARARGIN)

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

% Update handles structure
guidata(hObject, handles);

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


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

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)

str = get(handles.edit1,'String');
settaggio_sigma2Q = str2double(str);

% Hints: get(hObject,'String') returns contents of edit1 as text
%        str2double(get(hObject,'String')) returns contents of edit1 as a double


% --- Executes on button press in button2Q.
function button2Q_Callback(hObject, eventdata, handles)
% hObject    handle to button2Q (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

UTR_estim_0_yawr.m


% --- 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
Gli errori sono i seguenti:
Undefined variable "UTR_estim_0_yawr" or class "UTR_estim_0_yawr.m".

Error in prova_GUI>button2Q_Callback (line 93)
UTR_estim_0_yawr.m

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

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

Error in
matlab.graphics.internal.figfile.FigFile/read>@(hObject,eventdata)prova_GUI('button2Q_Callback',hObject,eventdata,guidata(hObject))
 
Error while evaluating UIControl Callback.
Spero possiate darmi una mano di aiuto. Vi ringrazio.

16 Risposte

  • Re: Settaggio di un Parametro inserito nella GUI

    Ammesso che il file con lo script si trovi in una directory inserita all'interno del "path" di MatLab, devi togliere il ".m" nella chiamata allo script, scrivendo solo il nome del file (UTR_estim_0_yawr).

    Per passare allo script il valore letto dalla casella di testo, la cosa più semplice che puoi fare è spostare l'istruzione per l'acquisizione della stringa dalla callback dell'edit in quella del pushbutton (questo ti evita di dover "condividere" una variabile tra le callbasks della GUI (cosa che, comunque, puoi facilmente fare usando la funzione "guidata").

    Lo script chiamato all'interno della callback condivide il Workspace con la callback per cui il valore del parametro letto dovrebbe essere direttamente "visibile" dallo script.
  • Re: Settaggio di un Parametro inserito nella GUI

    Ciao grazie per la risposta, quindi dici di spostare l'acquisizione del valore all'interno della callBack del pulsante e cosi posso usare direttamente la variabile di acquisizione all'interno dello script che richiamo sempre all'interno della stessa callBack?
  • Re: Settaggio di un Parametro inserito nella GUI

    Sì, così dovrebbe funzionare.
    Prova e vedi cosa succede.
  • Re: Settaggio di un Parametro inserito nella GUI

    Ok grazie, appena posso provo e vi faccio sapere.
  • Re: Settaggio di un Parametro inserito nella GUI

    Ciao ho provato a far quello che mi hai detto un paio di post fa e ti posto il codice per come l ho modificato, sperando di aver capito giusto, ma da ancora errore.
    function varargout = prova_GUI(varargin)
    % PROVA_GUI MATLAB code for prova_GUI.fig
    %      PROVA_GUI, by itself, creates a new PROVA_GUI or raises the existing
    %      singleton*.
    %
    %      H = PROVA_GUI returns the handle to a new PROVA_GUI or the handle to
    %      the existing singleton*.
    %
    %      PROVA_GUI('CALLBACK',hObject,eventData,handles,...) calls the local
    %      function named CALLBACK in PROVA_GUI.M with the given input arguments.
    %
    %      PROVA_GUI('Property','Value',...) creates a new PROVA_GUI or raises the
    %      existing singleton*.  Starting from the left, property value pairs are
    %      applied to the GUI before prova_GUI_OpeningFcn gets called.  An
    %      unrecognized property name or invalid value makes property application
    %      stop.  All inputs are passed to prova_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 prova_GUI
    
    % Last Modified by GUIDE v2.5 21-Jun-2018 17:40:15
    
    % Begin initialization code - DO NOT EDIT
    gui_Singleton = 1;
    gui_State = struct('gui_Name',       mfilename, ...
                       'gui_Singleton',  gui_Singleton, ...
                       'gui_OpeningFcn', @prova_GUI_OpeningFcn, ...
                       'gui_OutputFcn',  @prova_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 prova_GUI is made visible.
    function prova_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 prova_GUI (see VARARGIN)
    
    % Choose default command line output for prova_GUI
    handles.output = hObject;
    
    % Update handles structure
    guidata(hObject, handles);
    
    % UIWAIT makes prova_GUI wait for user response (see UIRESUME)
    % uiwait(handles.figure1);
    
    
    % --- Outputs from this function are returned to the command line.
    function varargout = prova_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;
    
    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 on button press in button2Q.
    function button2Q_Callback(hObject, eventdata, handles)
    % hObject    handle to button2Q (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    val_letto = str2double(hObject,'String');
    UTR_estim_0_yawr
    
    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
    

    Gli errori sono i seguenti:
    Error using str2double
    Too many input arguments.
    
    Error in prova_GUI>button2Q_Callback (line 91)
    val_letto = str2double(hObject,'String');
    
    Error in gui_mainfcn (line 95)
            feval(varargin{:});
    
    Error in prova_GUI (line 42)
        gui_mainfcn(gui_State, varargin{:});
    
    Error in
    matlab.graphics.internal.figfile.FigFile/read>@(hObject,eventdata)prova_GUI('button2Q_Callback',hObject,eventdata,guidata(hObject)) 
    Error while evaluating UIControl Callback.
    
    Dove sbaglio?
  • Re: Settaggio di un Parametro inserito nella GUI

    Nella callback hai scritto:
    
    val_letto = str2double(hObject,'String');
    
    mentre avresti dovuto scrivere qualcosa del tipo:
    
    str = get(handles.edit1,'String');
    settaggio_sigma2Q = str2double(str);
    
    Ovviamente il nome del parametro (in questo caso "settaggio_sigma2Q" deve essere lo stesso che usi nello script).

    Lo sbaglio, come descritto nel messaggio di errore che compare, consiste nel fatto che passi alla funzione "str2double" due parametri invece di uno (... Too many input arguments).

    Inoltre, i due parametri che passi, di per sè non contengono la stringa: il primo rappresenta l'handle della casella di testo ed il secondo il parametro che contiene la stringa.
  • Re: Settaggio di un Parametro inserito nella GUI

    Allora nello script che passo alla callBack del pulsante, il parametro che voglio settare si chiama sigma2Q. Scusami ma non ho mai programmato in matlab e confesso che mi sta facendo impazzire, quindi ti chiedo scusa se sono cosi ignorante e ti ringrazio molto per la tua disponibilita.

    Proverò a breve quest'ultima dritta. In questo caso quindi non devo dichiarare globalmente la variabile?

    Ti ringrazio.
  • Re: Settaggio di un Parametro inserito nella GUI

    Ti ringrazio tanto perche mi hai tolto un problema, ora riesco a far partire lo script e a plottare normalmente. Ti chiedo ora l'ultima cosa (almeno spero): come faccio a plottare sulla GUI? Che chiamata devo fare? Ti allego lo script aggiornato.
    function varargout = prova_GUI(varargin)
    % PROVA_GUI MATLAB code for prova_GUI.fig
    %      PROVA_GUI, by itself, creates a new PROVA_GUI or raises the existing
    %      singleton*.
    %
    %      H = PROVA_GUI returns the handle to a new PROVA_GUI or the handle to
    %      the existing singleton*.
    %
    %      PROVA_GUI('CALLBACK',hObject,eventData,handles,...) calls the local
    %      function named CALLBACK in PROVA_GUI.M with the given input arguments.
    %
    %      PROVA_GUI('Property','Value',...) creates a new PROVA_GUI or raises the
    %      existing singleton*.  Starting from the left, property value pairs are
    %      applied to the GUI before prova_GUI_OpeningFcn gets called.  An
    %      unrecognized property name or invalid value makes property application
    %      stop.  All inputs are passed to prova_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 prova_GUI
    
    % Last Modified by GUIDE v2.5 21-Jun-2018 17:40:15
    
    % Begin initialization code - DO NOT EDIT
    gui_Singleton = 1;
    gui_State = struct('gui_Name',       mfilename, ...
                       'gui_Singleton',  gui_Singleton, ...
                       'gui_OpeningFcn', @prova_GUI_OpeningFcn, ...
                       'gui_OutputFcn',  @prova_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 prova_GUI is made visible.
    function prova_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 prova_GUI (see VARARGIN)
    
    % Choose default command line output for prova_GUI
    handles.output = hObject;
    
    % Update handles structure
    guidata(hObject, handles);
    
    % UIWAIT makes prova_GUI wait for user response (see UIRESUME)
    % uiwait(handles.figure1);
    
    
    % --- Outputs from this function are returned to the command line.
    function varargout = prova_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;
    
    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 on button press in button2Q.
    function button2Q_Callback(hObject, eventdata, handles)
    % hObject    handle to button2Q (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    str = get(handles.edit1,'String');
    sigma2Q = str2double(str);
    UTR_estim_0_yawr
    
    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
    

    Ti ringrazio di nuovo
    Buona serata
  • Re: Settaggio di un Parametro inserito nella GUI

    Non c'è bisogno di dichiarare il parametro come "global".

    Se il "tag" della casella di testo è "edit1" e lo script da eseguire si chiama "UTR_estim_0_yawr", all'interno della callback del pushbutton puoi scrivere:
    
    % Acquisizione della stringa dalla casella di testo e conversione in numero
    sigma2Q=str2double(handles.edit1.String)
    % Verifi della consistenza dell'input
    if(~isnan(sigma2Q))
       UTR_estim_0_yawr
    else
       uiwait(msgbox('Il valore inserito non è valido','Input Error','modal'))
    end
    
    Nel codice è stato inserito anche un controllo di validità dell'input, per gestire il caso nel quale nella casella di testo non sia stato inserito un input (ad esempio una stringa di testo invece di un numero).

    Come ho scritto in precedenza, lo script condivide il Workspace con l callback per cui la variabile "sigma2Q" è direttamente "visibile" all'interno dello script.

    Prova ad eseguire il codice in modalità debug inserendo un breakpoint nella riga nella quale viene acquisita la stringa dalla casella di testo e ... vedi cosa succede (F11 quando raggiungi la linea con la chiamata allo script).

    https://it.mathworks.com/help/matlab/matlab_prog/debugging-process-and-features.html
  • Re: Settaggio di un Parametro inserito nella GUI

    Per quanto riguarda il plottaggio nella GUI, se, come appare dall'immagine, hai creato un "axes" nella GUI, il grafico dovrebbe "comprire" automaticamente nell GUI a meno che non ci siano altre finestre aperte con degli "axes".

    Dovresti pubblicare (almeno) la porzione di codice dello script che effettua il plottaggio altrimenti è difficile dare una risposta.
  • Re: Settaggio di un Parametro inserito nella GUI

    Ciao allora la porzione di codice che voglio plottare è la seguente:
    
    if plot_enable.yaw
        conv = 180/pi;
        figure; hold on, grid on;
        
        subplot(1,2,1)
        plot( conv*XEKF(5,:),'b--')
        hold on; axis tight; grid on;
        plot( conv*XUKF(5,:) ,'r-.');
        title('angolo di yaw [deg]')
        plot( conv*S_XEKF(5,:),'b.');
        plot( conv*S_XUKF(5,:),'r.');
        
        subplot(1,2,2)
        title('yaw_rate [deg/s]')
        plot(conv*XEKF(6,:), 'b--');
        hold on; axis tight; grid on;
        plot(conv*S_XEKF(6,:),'b');
        plot(conv*XUKF(6,:),'r-.');
        plot(conv*S_XUKF(6,:),'r.');
    end
    
    ovviamente al di sopra di questa parte di codice ho inserito
    axes(handles.axes1)
    ma ho il problema che la GUI si chiude nel momento in cui clicco sul pulsante. Non riesco neanche quindi a plottare sull GUI stessa se questa va via.

    Inoltre la parte di codice che devo plottare è inserita all'interno dello script di cui parlavamo qualche post prima. Quindi mi chiedo se non devo toglierlo da li dentro.

    Spero di ricevere per l'ennesima volta un aiuto e ringrazio ancora molto.
  • Re: Settaggio di un Parametro inserito nella GUI

    Per prima cosa, nel codice dello script
    
    if plot_enable.yaw
        conv = 180/pi;
        figure; hold on, grid on;    
    
       ...
    
    
    apri una nuova "finestra" e, subito dopo, con il comando "hold on" crei, implicitamente, un "axes" nella nuova finestra.
    Di conseguenza, questo annulla l'istruzione "axes(handles.axes1)" che hai scritto prima e le successive istruzioni per il plottaggio creano il grafico nel nuovo sistema di assi cartesiani.
    Dovresti quindi provare, come minimo, a cancellare la riga "figure; hold on, grid on;".

    Quanto al fatto che la GUI si chiuda nel momento nel quale premi il pulsante:
    [*] leggendo il codice della callback del pushbutton non mi sembra di vedere niente che giustifichi la chiusura della GUI
    [*] la GUI si "chiude" o viene messa in "secondo piano" o "ridotta a icona" mentre si apre la nuova finestra (vedi sopra)?
    [*] può essere che la nuova finestra si sovrapponga a quella della GUI?

    Dovresti provare ad eseguire il codice in modalità debug e vedere cosa succede:
    [*] lascia, per il momento, la riga "figure; hold on, grid on;"
    [*] inserisci un breakpoint nella prima istruzione della callback del pushbutton
    [*] premi il pushbutton
    [*] il "focus" dovrebbe passare al codice della GUI nella callback del pushbutton stesso
    [*] procedi con "F10" fino a raggiungere l'istruzione con la quale chiami lo script
    [*] a questo punto, premendo "F11" dovresti "entrare" nel codice dello script
    [*] avendo lasciato la riga "figure; hold on, grid on;" dovresti vedere che si crea una nuova finestra e, al suo interno, un axes
    [*] verifica se effettivamente e quando la GUI si chiude
    [*] prova poi a cancellare la riga "figure; hold on, grid on;" e riesegui la procedura sopra descritta: cosa succede?

    Per quanto riguarda lo script, in generale, niente vieta di inserire il suo codice direttamente nalla callback del pushbutton.
  • Re: Settaggio di un Parametro inserito nella GUI

    Ciao, ma se io prendessi quella parte di codice relativa al plottaggio, la togliessi da dentro lo script e la mettessi dentro la callback del pulsante, ovviamente togliendo "figure; hold on; grid on;" e mettendo all'inizio "axes(handles.axes1)", credi che andrebbe tutto bene?

    Provo a farlo e in caso ti dico.

    Grazie
  • Re: Settaggio di un Parametro inserito nella GUI

    Ciao ho risolto con il plottaggio, almeno in parte. Ora mi chiedo pero come modificare gli assi. Cioe mi spiego: quando creo un "axes", gli assi X e Y vanno da 0 a 1, io vorrei che l'Asse Y andasse da -1 a +1 e l'Asse X da 0 a 7000. Cosa devo modificare nelle proprietà?

    Grazie
Devi accedere o registrarti per scrivere nel forum
16 risposte