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 :

[uicontrol] pushbutton et action


Sujet :

Interfaces Graphiques

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Par défaut [uicontrol] pushbutton et action
    Bonjour,

    J'aimerais mettre un bouton sur un subplot (à la main sans utiliser guide). En cliquant dessus, il devra mettre l'option ginput en marche pour ce subplot (ensuite avec lui, récupérer deux valeurs etc, et lancer un autre code en fonction de la zone délimitée par l'encadrement de ginput)

    Alors en copiant l'exemple vu dans les tutos ici, j'ai simplement changer la dernière ligne

    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
    function exemple_main
    %EXEMPLE_MAIN Exemple d'une interface graphique codée à la main
     
    % Création de l'objet Figure
    fig = figure('units', 'pixels', ...
        'position', [520 380 300 200], ...
        'name', 'example_main');
     
    % Création de l'objet Uicontrol Pushbutton
    uicontrol('style', 'pushbutton', ...
        'units', 'pixels', ...
        'position',[75 10 150 20], ...
        'callback', @cb);
     
    % Création de l'objet Axes
    axes('units', 'pixels', ...
        'position', [25 40 250 150], ...
        'tag','axes1');
     
    % Stockage des identifiants utiles
    handles = guihandles(fig);
    guidata(fig,handles)
     
    function cb(obj,event)
    % Fonction associée au Callback de l'objet Pushbutton
    % obj : identifiant de l'objet Pushbutton
    % event : événement liés à l'objet Pushbutton
     
    % Récupération des identifiants utiles
    fig = get(obj,'parent');
    handles = guidata(fig);
     
    % Modification de la couleur de l'objet Axes
    [x,y]=ginput(2)
    Cependant, questions bêtes mais

    - comment fait on pour sortir les variables x et y?
    - peut faire plus simple sans écrire de fonction pour que tout soit dans le même fichier .m

    Merci d'avance.

  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
    Tu peux faire comme ceci :

    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
    function fun
     
    figure
     
    subplot(...);
     
    subplot(...);
     
    uicontrol('callback',@cb);
     
    function cb(obj,event)
     
    [x,y] = ginput(2);
     
    dosomething(x,y)
     
    function dosomething(x,y)
     
    ...
    ou la même chose avec des fonctions imbriquées :

    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
    function fun
     
    x = [];
    y = [];
     
    figure
     
    subplot(...);
     
    subplot(...);
     
    uicontrol('callback',@cb);
     
        function cb(obj,event)
     
            [x,y] = ginput(2);
     
            dosomething
     
        end
     
        function dosomething
     
            ...
     
        end
     
    end

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Par défaut
    Merci Dut,

    Mais je ne comprends pas la syntaxe.
    Qu'est une fonction fun? pourquoi n'y a t il pas les arguments de sorties (x et y)?
    Ne puis je pas mettre cette commande directement dans mon fichier m principal? suis je obligé de passer par une fonction?

    Pourquoi la fonction ci-dessous ne marche t elle pas? (message d'erreur au sujet de @cb)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function [x,y]=encadrement(handles_fig)
     
    uicontrol('callback',@cb);
     
    [x,y] = ginput(2);
     
    end
    Merci d'avance

  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
    La fonction fun correspond à ton code transformé en fonction.
    Je pensais que les deux appels à subplot faciliteraient l'analogie.

    La callback d'un uicontrol est une fonction (d'où function cb(obj,event))

    Si tu veux mettre le callback dans le fichier .m qui contient déjà ton code, alors il faut transformer le script en fonction.
    Car un script ne peut pas contenir de sous fonction.

    Une autre solution consiste à mettre le contenu du callback (la fonction cb) dans un autre fichier .m.
    Dans ce cas, tu peux conserver ton code dans un script.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Par défaut
    ha oui effectivement c'était clair. Autant pour moi.

    Je vais resté sur l'idée de faire une fonction à part, car en transformant mon script en fonction, je n'ai plus accès à toutes les variables.

    Je pensais qu'en mettant dans mon script:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    uicontrol('callback',@cb);
    [x,y]=cb(obj,event)
    avec la fonction cb.m

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        function [x,y]= cb(obj,event)
            [x,y] = ginput(2);
     
        end
    ça marcherait.. mais non.. pourtant il me retourne le message d'erreur suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Undefined function or variable 'obj'.
    
    Error in ReadTestAllGCF_3C_ginput (line 141)
    cb(obj,event)
    Je comprends bien que "obj" n'est pas défini mais il ne l'était pas non plus avant et pourtant ce message n’apparaissait pas.

    Merci d'avance pour quelques conseils..

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

    Citation Envoyé par Newenda
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    uicontrol('callback',@cb);
    [x,y]=cb(obj,event)
    La première ligne sert à spécifier que lorsque l'utilisateur appui sur le pushbutton, on exécute la fonction cb, et seulement à ce moment-là. Et c'est le mécanisme interne des évènements qui l'appelle et lui fourni ses paramètres obj (dans notre cas le handle du pushbutton) et event (vide ici), ce n'est pas à toi de l'appeler.
    Sache que ta seconde ligne est immédiatement exécutée après la première, soit de suite après la création du bouton, et donc avant même (ou presque) que le bouton apparaisse à l'écran.
    Les paramètres ne sont connus qu'à l'intérieur de la fonction cb, et pas ailleurs.

Discussions similaires

  1. [Débutant] attendre action sur pushbutton
    Par Aurel51 dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 25/05/2012, 13h40
  2. [Débutant] Création de pushbuttons et attente d'action de l'utilisateur
    Par jasdu95 dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 24/10/2010, 17h24
  3. action APRES chargement complet ...
    Par PinGuy dans le forum Delphi
    Réponses: 7
    Dernier message: 06/07/2006, 17h16
  4. [TCheckBox] Neutraliser l'action
    Par Lucien dans le forum Composants VCL
    Réponses: 5
    Dernier message: 14/09/2003, 12h15
  5. [Syntaxe] Action simultanée sur plusieurs élements
    Par FranT dans le forum Composants VCL
    Réponses: 2
    Dernier message: 20/03/2003, 20h20

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