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 :

Comportement inattendu de Callback sur pushbutton


Sujet :

Interfaces Graphiques

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Mai 2012
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 9
    Par défaut Comportement inattendu de Callback sur pushbutton
    Bonjour,

    Je viens vers vous pour un problème que je rencontre avec un de mes scripts avec interface utilisateur sur MATLAB R2009b. J'ai réussi à résoudre le problème mais je ne comprends pas le fonctionnement latent.

    Voici directement le code très simple (j'utilise une syntaxe moche mais qui fonctionne : écrire dans le callback directement les instructions en chaine de caractères) :

    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
    clear all
     
    guy(1).name = 'Tata';
    guy(2).name = 'Titi';
    guy(3).name = 'Toto';
    guy(4).name = 'Tutu';
     
    for i=1:length(guy)
        h = uicontrol('Style', 'pushbutton', 'String', guy(i).name,...
            'Position', [10 5+40*(i-1) 160 35], 'Callback', 'disp(guy(i).name);');
    end
     
    % for i=1:length(guy)
    %     h = uicontrol('Style', 'pushbutton', 'String', guy(i).name,...
    %         'Position', [10 5+40*(i-1) 160 35], 'Callback', ['disp(''',guy(i).name,''');']);
    % end
    Je vous propose d'essayer le code directement, ce sera plus parlant. La première instruction affichera 'Tutu' quel que soit le bouton choisi alors que la deuxième (à décommenter pour essayer) affichera le nom correspondant au bouton. On dirait que la première syntaxe évalue l'expression seulement au choix du bouton alors que la deuxième le fait pendant l'exécution du code.

    Je cherche pas d'aide pour améliorer le code (utiliser des appels de fonctions etc.) mais juste à savoir si quelqu'un a une explication rationelle pour ce fonctionnement qui me parait incompréhensible (les deux chaines de caractères dans les callbacks sont censées être identiques).

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 317
    Par défaut
    Rien de bien magique

    Tu écris ton code dans un script donc toutes les variables sont contenues dans le même espace de travail et accessibles de partout, même depuis les callback des boutons.

    A la fin de l'exécution du code, la variable i vaut 4 (cela est dû à la boucle for-end)

    Donc quant tu cliques sur un bouton le callback utilise tout le temps la valeur 4 pour i, quelque soit le bouton utilisé. Tu affiches donc tout le temps guy(4).name.

    Alors que dans le bloc mis en commentaire, tu écris en dur la valeur de guy(i).name dans le callback. Il n'y a donc plus de problème.

    Donc tout ça pour dire que... c'est très mal codé

  3. #3
    Membre habitué
    Inscrit en
    Mai 2012
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 9
    Par défaut
    En fait le premier comportement me semble logique, lorsque le Callback est exécuté (a priori au clic sur le bouton), la valeur de i est toujours de 4.

    Pourquoi le fait de "l'écrire en dur dans le script" y change quelque chose ? Je me serais attendu à avoir 'Tutu' dans tous les cas, comme avec la première instruction.

    Edit : ok merci pour l'explication. La propriété Callback est donc bel et bien associée à chaque pusbutton respectif.

    Edit 2 : je trouve que c'est assez inattendu dans tous les cas. ;D

  4. #4
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 317
    Par défaut
    Tu peux ausis tester comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i=1:length(guy)
        'disp(guy(i).name);'
    end
    renvoie
    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
    ans =
     
    disp(guy(i).name);
     
     
    ans =
     
    disp(guy(i).name);
     
     
    ans =
     
    disp(guy(i).name);
     
     
    ans =
     
    disp(guy(i).name);
    alors que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i=1:length(guy)
        ['disp(''',guy(i).name,''');']
    end
    renvoie
    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
    ans =
     
    disp('Tata');
     
     
    ans =
     
    disp('Titi');
     
     
    ans =
     
    disp('Toto');
     
     
    ans =
     
    disp('Tutu');

  5. #5
    Membre habitué
    Inscrit en
    Mai 2012
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 9
    Par défaut
    Ok Dut merci pour la précision, je comprends le principe.

    Problème résolu donc !

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Dans la première version, tu fournis une simple chaine 'disp(guy(i).name);' qui sera effectivement évaluée seulement lors de l'appui sur le bouton, et donc avec la valeur de i à ce moment là (ici 4 à la fin de la boucle).

    Dans la seconde version, guy(i).name non situé dans la chaîne est évalué à la création de l'objet Uicontrol. On assigne donc les différentes chaînes résultantes aux Callback :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    'Callback', 'disp('Tata');' );
    'Callback', 'disp('Titi');' );
    'Callback', 'disp('Toto');' );
    'Callback', 'disp('Tutu');' );

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

Discussions similaires

  1. Problème d'un callback sur un pushbutton
    Par tinange dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 13/06/2011, 18h33
  2. Appel d'un callback sur un event un peu particulier
    Par Jim_Nastiq dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 04/06/2007, 16h40
  3. [XSLT]Problème de comportement inattendu
    Par kalimatchoum dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 06/03/2007, 18h33
  4. [PL/SQL][Oracle9] Proc. Stoc. comportement inattendue
    Par Carlito_superheros dans le forum Oracle
    Réponses: 2
    Dernier message: 30/08/2006, 16h13
  5. Comportement inattendu de Firefox
    Par reggae dans le forum Firefox
    Réponses: 3
    Dernier message: 08/05/2006, 21h15

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