2015-08-14 2 views
0

J'essaye d'initialiser une GUI (construite avec GUIDE) avec des valeurs par défaut et puis, si l'utilisateur ne change pas les valeurs par défaut, utilise ces valeurs dans une fonction déclenchée par un rappel par bouton-poussoir.Matlab: définir les valeurs par défaut pour le texte d'édition de GUI et les utiliser dans le rappel par bouton-poussoir

Pour ce faire, à l'intérieur du _CreateFcn, je suis stocker les valeurs par défaut dans le handles, puis définissez la valeur par défaut de l'interface graphique avec set(hObject, ...) et enfin mettre à jour le guidata avec guidata(hObject, handles);

Si l'utilisateur change la valeur, je stocker la valeur actualisée dans les poignées à l'intérieur de la fonction _Callback lecture de la valeur avec get(hObject, ...) et mise à jour du guidata avec guidata(hObject, handles);

Lorsque le bouton est enfoncé, dans la fonction bouton _Callback, j'extraire la valeur de la handles.

Qu'arrive t-il est la suivante:

  • si l'utilisateur ne changer la valeur sur l'interface graphique et pousse simplement sur le bouton, ce que je lis à partir de la variable stockée dans les poignées est pas la valeur de la variable, mais la poignée réelle à la variable (par exemple: 27.0098876953125)
  • Si, d'autre part, l'utilisateur ne changer la valeur avant de pousser le bouton, puis jamais ything fonctionne bien et j'obtiens la valeur variable réelle.

Que manque-t-il?

Mise à jour

Après oro777 commentaire que j'ai ajouté le reste du code pour une meilleure analyse. J'ai aussi essayé avec une version plus récente (R2015b) de Matlab et le résultat est le même, avec la différence que maintenant la disp dans la fonction de rappel de bouton montre toute la structure de la poignée au lieu de simplement l'ID:

UIControl (ampmin) with properties: 

      Style: 'edit' 
     String: '1' 
BackgroundColor: [1 1 1] 
     Callback: @(hObject,eventdata)GUI('ampmin_Callback',hObject,eventdata,guidata(hObject)) 
      Value: 0 
     Position: [15.6000 14.6154 10.2000 1.6923] 
      Units: 'characters' 

Use get to show all properties 

J'ai aussi remarqué ce qui suit: - Si je commence le tout fichier .fig fonctionne très bien - Si je pousse le bouton run sur le fichier .m, le comportement étrange décrit ci-dessus se produit

Voici le code:

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

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

% Last Modified by GUIDE v2.5 14-Aug-2015 10:39:46 

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

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

% Update handles structure 
guidata(hObject, handles); 

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


% --- Outputs from this function are returned to the command line. 
function varargout = GUI2_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 startAnalysis. 
function startAnalysis_Callback(hObject, eventdata, handles) 
% hObject handle to startAnalysis (see GCBO) 
% eventdata reserved - to be defined in a future version of MATLAB 
% handles structure with handles and user data (see GUIDATA) 

disp(handles.ampmin) 





function ampmin_Callback(hObject, eventdata, handles) 
% hObject handle to ampmin (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 ampmin as text 
%  str2double(get(hObject,'String')) returns contents of ampmin as a double 
handles.ampmin = str2double(get(hObject,'String')); 

% Update handles structure 
guidata(hObject, handles); 

% --- Executes during object creation, after setting all properties. 
function ampmin_CreateFcn(hObject, eventdata, handles) 
% hObject handle to ampmin (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 

handles.ampmin = 1.0; 
disp(handles.ampmin) 
set(hObject, 'String', num2str(handles.ampmin)) 

% Update handles structure 
guidata(hObject, handles); 
+0

J'ai essayé votre code et ça marche très bien pour moi. Je suppose que le reste de votre code gâche quelque chose. – oro777

+0

Vous avez un problème parce que ** écraser ** le handle avec votre valeur personnalisée. Vous ne devez rien écrire par dessus 'handle.ampmin', ceci est défini par' GUIDE' pour conserver le handle de 'uicontrol'. Si vous voulez stocker des données dans la structure 'handles', définissez un nouveau champ personnalisé:' handles.ampminValue = str2double (get (hObject, 'String')); ' – Hoki

Répondre

0

Merci @Hoki, c'était le problème. Comme je ne voyais aucune référence directe à handles.ampmin, je ne pensais pas qu'il serait utilisé pour stocker le handle, mais en regardant le code réel .fig exporté, il est devenu évident que c'est effectivement la poignée uicontrol est stockée.