IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Interfaces Graphiques Discussion :

[GUIDE] problème de handles


Sujet :

Interfaces Graphiques

  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 83
    Points : 30
    Points
    30
    Par défaut [GUIDE] problème de handles
    Bonjour

    J'effectue une interface graphique sous GUIDE.
    Je dois afficher 1 courbe, qui varie selon 2 paramètres. Ces 2 paramètres sont modifiables via 2 pop-up-menus.
    J'ai un souçis au niveau de la structure handles.

    Voici pour code pour préciser mon problème

    1er popup-menu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    %recup de la structure handles à jour
    handles = guidata(gcbf); 
     
    %Simplification d'écriture
    temps = handles.temps;
    x = handles.x;
    Te = handles.Te;
     
     
    %Effacement des courbes 3 et 4
    cla (handles.axes3);
    cla (handles.axes4);
     
    %Récupération de la valeur de N du pop-menu
    str=get(hObject,'String');
    val=get(hObject,'Value');
    str=cellstr(str); 
    str=str{val};
    N = str; % N est de type char
    N = str2double(N); %conversion de N en type double
     
    tic
    %définition de la base de fréquence
    fe=1/Te; % fréquence d'échantillonnage
    f=fe*(-N/2:N/2-1)/N;
     
    %libération de l'espace mémoire
    clear s S;
     
    %Test si on peut faire au moins 2 échantillons de longueur N sur le signal
    if (length(temps) < (2*N))
        cla (handles.axes2);
        cla (handles.axes3);
        cla (handles.axes4);
        title(handles.axes2,'Représentation du signal temps/fréquence','Color','b');
        title(handles.axes3,'Spectre','Color','b');    
        errordlg('Désolé, mais le nombre de points choisis pour la fft est trop grand par rapport au nombre d''échantillons du signal, veuillez choisir une valeur de N plus faible','N est trop grand!');
    end
     
    % sauvegarde de la structure handles
    guidata(hObject, handles); 
     
    %Récupération de la fenêtre de pondération
    popupmenu3_Callback(hObject, eventdata, handles);
    %recup de la structure handles à jour
    handles = guidata(gcbf);
    handles.swin=swin;
    Calcul puis affichage
    2è pop-up-menu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    %recup de la structure handles à jour
    handles = guidata(gcbf); 
     
    handles 
    %Effacement des courbes 3 et 4
    cla (handles.axes3);
    cla (handles.axes4);
     
    N=handles.N;
    temps = handles.temps;
    Te= handles.Te;
     
    %Récupération de la valeur de win du pop-menu
    str=get(hObject,'String');
    val=get(hObject,'Value');
    str=cellstr(str); 
    str=str{val};
    win = str % N est de type char
     
    %Création de la fenêtre 
    if length(win) == 7 & win == 'Hamming'
        swin = hamming(N);
    elseif length(win) == 7 & win == 'Hanning'
        swin = hann(N);
    elseif length(win) == 13 & win == 'Rectangulaire'
        swin = (ones(1,N));
    elseif length(win) == 8 & win == 'Blackman'
        swin = blackman (N);
    elseif length(win) == 1 & win == ' '
        swin = 1;
    elseif length(win) == 8 & win == 'Bartlett'
        swin = bartlett(N);
    end
     
    handles.swin = swin;
    guidata(gcbf,handles);
    La valeur du 1er popupmenu est stocké dans la variable N, et la 2è dans la variable swin.

    Mon problème est que dans le 1er pop-up-menu, j'ai besoin de swin, or il ne pas dans la structure handles, alors que j'ai bien appelé le callback du 2è popupmenu, et mis la structure handles à jour..
    Je ne vois pas d'où me venir mon erreur...

  2. #2
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 828
    Points
    14 828
    Par défaut
    Citation Envoyé par El_bennito Voir le message
    Or, dans le 1er popupmenu, j'ai bien mis la valeur de N dans la structure handles
    Pas dans le code que tu nous montres ici en tout cas.
    Je ne vois nulle part :

  3. #3
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 83
    Points : 30
    Points
    30
    Par défaut
    oui, désolé, c'était un ancien post que j'avais fait, mais ayant trouvé la réponse, j'ai oublié de le modifier en mettant mon nouveau problème, que j'ai éditer dans mon 1er post (est-ce clair? ).

    Mon code est donc le suivant :
    1er pop-up :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    %recup de la structure handles à jour
    handles = guidata(gcbf); 
     
    %Simplification d'écriture
    temps = handles.temps;
    x = handles.x;
    Te = handles.Te;
     
     
    %Effacement des courbes 3 et 4
    cla (handles.axes3);
    cla (handles.axes4);
     
    %Récupération de la valeur de N du pop-menu
    str=get(hObject,'String');
    val=get(hObject,'Value');
    str=cellstr(str); 
    str=str{val};
    N = str; % N est de type char
    N = str2double(N); %conversion de N en type double
     
    handles.N = N;
    tic
    %définition de la base de fréquence
    fe=1/Te; % fréquence d'échantillonnage
    f=fe*(-N/2:N/2-1)/N;
     
    %libération de l'espace mémoire
    clear s S;
     
    %Test si on peut faire au moins 2 échantillons de longueur N sur le signal
    if (length(temps) < (2*N))
        cla (handles.axes2);
        cla (handles.axes3);
        cla (handles.axes4);
        title(handles.axes2,'Représentation du signal temps/fréquence','Color','b');
        title(handles.axes3,'Spectre','Color','b');    
        errordlg('Désolé, mais le nombre de points choisis pour la fft est trop grand par rapport au nombre d''échantillons du signal, veuillez choisir une valeur de N plus faible','N est trop grand!');
    end
     
    % sauvegarde de la structure handles
    guidata(hObject, handles); 
    %recup de la structure handles à jour
    handles = guidata(gcbf); 
     
    %Récupération de la fenêtre de pondération
    popupmenu3_Callback(hObject, eventdata, handles);
    %recup de la structure handles à jour
    handles = guidata(gcbf); 
    swin = handles.swin ;
    2è pop-up :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    %recup de la structure handles à jour
    handles = guidata(gcbf); 
     
    handles 
    %Effacement des courbes 3 et 4
    cla (handles.axes3);
    cla (handles.axes4);
     
    N=handles.N;
    temps = handles.temps;
    Te= handles.Te;
     
    %Récupération de la valeur de win du pop-menu
    str=get(hObject,'String');
    val=get(hObject,'Value');
    str=cellstr(str); 
    str=str{val};
    win = str % N est de type char
     
    %Création de la fenêtre 
    if length(win) == 7 & win == 'Hamming'
        swin = hamming(N);
    elseif length(win) == 7 & win == 'Hanning'
        swin = hann(N);
    elseif length(win) == 13 & win == 'Rectangulaire'
        swin = (ones(1,N));
    elseif length(win) == 8 & win == 'Blackman'
        swin = blackman (N);
    elseif length(win) == 1 & win == ' '
        swin = 1;
    elseif length(win) == 8 & win == 'Bartlett'
        swin = bartlett(N);
    else swin = 1;
    end
    handles.swin  = swin;
    guidata(gcbf,handles);
    et swin est inconnue au bataillon dans le 1er pop-up...

  4. #4
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Points : 4 661
    Points
    4 661
    Par défaut
    Bonjour,

    Rapidement, tu peux déjà réduire ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    str=get(hObject,'String');
    val=get(hObject,'Value');
    str=cellstr(str); 
    str=str{val};
    N = str; % N est de type char
    N = str2double(N); %conversion de N en type double
    Ca doit donner quelquechose comme çà:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    str=get(hObject,'String');
    N = str2double(str{get(hObject,'Value')});
    Sinon pour ton problème, pourquoi ne pas récupérer la valeur de ton premier popup dans ton second de la même manière?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    str=get(handles.popupmenu1,'String');
    N = str2double(str{get(handles.popupmenu1,'Value')});
    Bonne journée,
    Duf

    Edit: Bon je suis un peu à la masse, j'arrive après la bataille

  5. #5
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 828
    Points
    14 828
    Par défaut
    Ca aurait été bien de mettre les entêtes aussi des sous-fonctions aussi.
    Je suppose que l'appel à[FONT="monospace"]popupmenu3_Callback[/FONT] correspond à ce que tu appeles ton 2ème popup (ben oui c'est pas évident ) ?
    Dans ce cas le truc c'est qu'il faut re-récupérer la structure handles mise à jour avec GUIDATA après l'appel de cette sous-fonction.
    En fait tu le fais mais au mauvais endroit c'est après l'appel.

    Ce qui se passe :
    1 - dans le 1er popup : tu as bien mis à jour ta structure handles (qui contient donc N mais pas swin)
    2 - tu vas dans le 2ème, tu mets swin dans la structure handles
    3 - tu reviens dans le 1 la structure handles connue est celle de l'étape 1. puisque tu ne récupères pas l'info qui a été stickée dans le 2 par GUIDATA.

    Ce n'est pas facile à expliquer, et donc pas forcément facile à comprendre mais en gros tant qu'une valeur (ici handles) n'est pas modifiée dans le corps même de la sous-fonction concernée (la 1), ben elle ne change pas (même si elle a changé ailleurs...)

  6. #6
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 83
    Points : 30
    Points
    30
    Par défaut
    POur Duf42 : Merci pour la réduction du code

    POur Caro-Line : oui, j'ai pas été super clair, mon 1er pop-up est le popupmenu2 et le 2è c'est le popupmenu3, ca va de soit

    c'est cela ouiii, pas tout compris

    Mais dans le 1erpopup, après l'appel a popupmenu3_Callback, j'ai pourtant bien efectué l'appel a guidata

  7. #7
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 83
    Points : 30
    Points
    30
    Par défaut
    C'est good, en fait, j'ai fait comme ça :

    1er popup :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    %Récupération de la valeur de swin
    str=get(handles.popupmenu3,'String');
    win = str{get(handles.popupmenu3,'Value')}
     
    %Calcule de la fenêtre
    %Création de la fenêtre 
    if length(win) == 7 & win == 'Hamming'
        swin = hamming(N);
    elseif length(win) == 7 & win == 'Hanning'
        swin = hann(N);
    elseif length(win) == 13 & win == 'Rectangulaire'
        swin = (ones(1,N));
    elseif length(win) == 8 & win == 'Blackman'
        swin = blackman (N);
    elseif length(win) == 1 & win == ' '
        swin = 1;
    elseif length(win) == 8 & win == 'Bartlett'
        swin = bartlett(N);
    else swin = 1;
    end
    2è :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    %recup de la structure handles à jour
    handles = guidata(gcbf); 
     
    %Récupération de la valeur de win du pop-menu
    str=get(hObject,'String');
    win =(str{get(hObject,'Value')});
     
    %On refait le calcul
    popupmenu2_Callback(hObject, eventdata, handles);
     
    %Sauvegarde de handles mise à jour
    guidata(gcbf,handles);
    et ça a l'air de fonctionner par trop mal.

    Merci beaucoup !

  8. #8
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 83
    Points : 30
    Points
    30
    Par défaut
    En fait, ça ne fonctionne pas si bien que ça...

    Mon 1er pop-up, pas de problème, il récupère bien la valeur de N, et la valeur de win, valeur du 2nd pop-up.

    Par contre, lorsque je change la valeur de second pop-up, je dois réeffectuer le callback du 1er popup (pour refaire le calcul et l'affichae des courbes), je sais pas si c'est très clair.
    Et donc, quand je fais ceci, il me met que la valeur de N est NaN..

    Pourtant, lorsque je mets la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    popupmenu2_Callback(hObject, eventdata, handles);
    dans le callback du 2nd pop-up, il devrait saisir la valeur de N, non?

    voici le code (avec les en-têtes des fonctions ):



    Edit : J'ai trouvé, dans le popupmenu2_Callback, lorsque je récupère la valeur de N, il fallait mettre handles.popupmenu2 et non hObject, puisque dans le callback du popupmenu3, ça faisait foire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    function popupmenu3_Callback(hObject, eventdata, handles)
    % hObject    handle to popupmenu3 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
     
    %recup de la structure handles à jour
    handles = guidata(gcbf); 
     
    % %Récupération de la valeur de win du pop-menu
    % str=get(hObject,'String');
    % win =(str{get(hObject,'Value')});
     
    %On refait le calcul
    popupmenu2_Callback(hObject, eventdata, handles);
     
    %Sauvegarde de handles mise à jour
    guidata(gcbf,handles);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    function popupmenu2_Callback(hObject, eventdata, handles)
    % hObject    handle to popupmenu2 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
     
    %recup de la structure handles à jour
    handles = guidata(gcbf); 
     
    %Simplification d'écriture
    temps = handles.temps;
    x = handles.x;
    Te = handles.Te;
     
     
    %Effacement des courbes 3 et 4
    cla (handles.axes3);
    cla (handles.axes4);
     
    %Récupération de la valeur de N du pop-menu
    str=get(hObject,'String');
    N = str2double(str{get(hObject,'Value')});
    handles.N = N;
     
    tic
    %définition de la base de fréquence
    fe=1/Te; % fréquence d'échantillonnage
    f=fe*(-N/2:N/2-1)/N;
     
    %libération de l'espace mémoire
    clear s S;
     
    %Test si on peut faire au moins 2 échantillons de longueur N sur le signal
    if (length(temps) < (2*N))
        cla (handles.axes2);
        cla (handles.axes3);
        cla (handles.axes4);
        title(handles.axes2,'Représentation du signal temps/fréquence','Color','b');
        title(handles.axes3,'Spectre','Color','b');    
        errordlg('Désolé, mais le nombre de points choisis pour la fft est trop grand par rapport au nombre d''échantillons du signal, veuillez choisir une valeur de N plus faible','N est trop grand!');
    end
     
    %Récupération de la valeur de swin
    str=get(handles.popupmenu3,'String');
    win = str{get(handles.popupmenu3,'Value')}
     
    %Création de la fenêtre 
    if length(win) == 7 & win == 'Hamming'
        swin = hamming(N);
    elseif length(win) == 7 & win == 'Hanning'
        swin = hann(N);
    elseif length(win) == 13 & win == 'Rectangulaire'
        swin = (ones(1,N));
    elseif length(win) == 8 & win == 'Blackman'
        swin = blackman (N);
    elseif length(win) == 1 & win == ' '
        swin = 1;
    elseif length(win) == 8 & win == 'Bartlett'
        swin = bartlett(N);
    else swin = 1;
    end
    Calcul et Affichage

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème création handle
    Par maicheul dans le forum Débuter
    Réponses: 6
    Dernier message: 16/06/2009, 23h04
  2. Problème de handles
    Par Zhitoune dans le forum Interfaces Graphiques
    Réponses: 5
    Dernier message: 18/12/2008, 16h47
  3. problème de handle dans le callback d'un bouton
    Par ZeFMG dans le forum Interfaces Graphiques
    Réponses: 3
    Dernier message: 04/11/2008, 12h48
  4. GUI & Timer => problème d'handle sur la figure
    Par wintereivax dans le forum Interfaces Graphiques
    Réponses: 10
    Dernier message: 13/01/2008, 22h20
  5. Send/PostMessage problème de handle
    Par bibmari dans le forum C++Builder
    Réponses: 18
    Dernier message: 21/06/2005, 17h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo