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 :

Pushbuttons et edit texts créés dynamiquement - Appel d'un Callback


Sujet :

Interfaces Graphiques

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2009
    Messages : 10
    Points : 5
    Points
    5
    Par défaut Pushbuttons et edit texts créés dynamiquement - Appel d'un Callback
    Bonjour à tous,

    J'ai un problème assez proche de celui de tarzan_tlse dans cette discussion : Création dynamique de X pushbutton(s), mais il doit me manquer des compétences pour tirer quelque chose de ce qui a été dit précédement... ou alors je poste pas du tout au bon endroit.. j'ai quelques doutes..

    Je précise mon problème :
    J'entre un nombre entier N dans un edit text de ma figure principale (interface2.fig) et en cliquant sur un bouton valider, une nouvelle fenetre s'affiche. Dans cette fenetre, je génère N couples (pushbutton, edittext) auxquels j'attribue N couples de tags (pushTagN, editTagN).

    Je veux donc créer une fonction que j'appellerai en Callback depuis chacun de mes pushbutton qui me permettra de rechercher un repertoire (uigetdir()) et d'afficher leurs chemins dans les edittexts correspondants.

    J'ai fait le tour de la doc Matlab concernant les Callbacks et j'avoue ne toujours pas comprendre comment passer des paramètres (mes editTagN ici)...
    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
     
    % --- Executes on button press in pushbutton7.
    function pushbutton7_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton7 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    a = 100;
    b = str2double(get(handles.edit7, 'String'));
    fig = figure('Name', 'Propriétés des folders', 'NumberTitle', 'off', 'MenuBar', 'none', 'Color', [0.925 0.914 0.847], 'Position', [360 502 400 a*b]);
    movegui(fig,'center')
    c = 10;
    for i = 1:b
        editTag = ['editTag' num2str(i)];
        uicontrol('Style', 'edit', 'Position', [20 c 360 20], 'HorizontalAlignment', 'left', 'Tag', editTag, 'Parent', fig, 'BackgroundColor', [1 1 1], 'ForegroundColor', [0 0 0]);
        pushTag = ['pushTag' num2str(i)];
        uicontrol('Style', 'pushbutton', 'Position', [80 c+30 70 22], 'Tag', pushTag, 'Callback', mafonctioncallback , 'String', 'Parcourir', 'Parent', fig, 'BackgroundColor', [1 1 1], 'ForegroundColor', [0 0 0]);    
        c = c+100;
    end
    Je remercie bien quiconque pourrait m'aider!

  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
    Je ne comprends pas du tout ce que tu veux
    A qui veux-tu passer des paramètres ?

    De ce que je comprends ce n'est pas forcément nécessaire puisque tu devrais pouvoir retrouver le Tag de l'objet courant (hObject) dans le callback.

    Note : attention tu as déjà semble-t-il créé avant la boucle des objets avec les tags pushbutton7 et edit7, cela risque de porter à confusion.
    C'est pour cela que personnellement je ne me fie pas aux Tags qui ne sont pas obligatoirement uniques.
    Il faut travailler avec les handles.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2009
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Merci pour avoir déplacé le message.
    J'ai surement pas été assez clair... peut être qu'avec un aperçu de ma figure ...(en pièce jointe).

    Je veux qu'en cliquant sur mes pushbuttons tagués "pushTagN" une fenêtre me permettant de parcourir l'arborescence windows s'ouvre et que les dossiers choisis s'affichent dans les edit text correspondants (tagués "editTagN").

    Je veux donc écrire une fonction appelée en Callback des pushbuttons qui puisse récupérer le Tag de l'edit text correspondant au bouton cliqué (le passer en paramètre de la fonction) pour y écrire mon résultat.

    La fonction ressemblerait plus ou moins à cà : (bien evidement celle ci ne fonitonne pas puisque je ne recupère pas, en paramètre, mon "editTagN" correspondant au pushbutton cliqué tagué "pushTagN")

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    function pushbutton(hObject, eventdata, handles)
    dir = uigetdir();
    set(handles.editTagN, 'String', dir);
    .

    Le nombre de couples (pushbutton, edit text) est précédemment choisi par l'utilisateur qui a cliqué sur un bouton valider (tagué pushbutton7) pour afficher la fenêtre en pièce jointe.

    En ce qui concerne les tags, je fais toujours en sorte qu'ils soient uniques.

    En espérant avoir été plus clair.
    Merci d'avance pour ton aide....
    Images attachées Images attachées  

  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,

    Une idée (à mettre dans le callback de ton pushbutton):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    pb_tag = get(hObject, 'String');
    edit_tag = strrep(pb_tag, 'push', 'edit');
     
    set(handles.(edit_tag), 'String', dir);
    Et si je peux me permettre une remarque, ce n'est pas une bonne idée d'appeler ta variable 'dir' car DIR est aussi une fonction MATLAB...

    Bon courage,
    Duf

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2009
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Merci Duf.

    Mon code est maintenant le suivant :

    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
     
     
    % --- Executes on button press in pushbutton7.
    function pushbutton7_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton7 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    a = 100;
    b = str2double(get(handles.edit7, 'String'));
    fig = figure('Name', 'Propriétés des jeux d''images', 'NumberTitle', 'off', 'MenuBar', 'figure', 'Color', [0.925 0.914 0.847], 'Position', [360 502 400 a*b]);
    movegui(fig,'center')
    c = 10;
    for i = 1:b
        j = num2str(i);
        string = ['Folder' j];
        uicontrol('Style', 'text', 'Position', [20 c+30 40 20], 'HorizontalAlignment', 'left', 'Tag', string, 'String', string, 'Parent', fig, 'BackgroundColor', [0.925 0.914 0.847], 'ForegroundColor', [0 0 0]);
        editTag = ['editTag' j];
        uicontrol('Style', 'edit', 'Position', [20 c 360 20], 'HorizontalAlignment', 'left', 'Tag', editTag, 'Parent', fig, 'BackgroundColor', [1 1 1], 'ForegroundColor', [0 0 0]);
        pushTag = ['pushTag' j];
        uicontrol('Style', 'pushbutton', 'Position', [80 c+30 70 22], 'Tag', pushTag, 'Callback', @pushbuttonI_Callback, 'String', 'Parcourir', 'Parent', fig, 'BackgroundColor', [1 1 1], 'ForegroundColor', [0 0 0]);    
        c = c+100;
    end
     
     
    function pushbuttonI_Callback(hObject,event)
        directory = uigetdir();
        pb_tag = get(hObject, 'Tag');
        edit_tag = strrep(pb_tag, 'push', 'edit');
        set(handles.(edit_tag), 'String', directory);

    Étonnamment, sur clic de mes pushbuttons (le 3 par exemple) et après avoir sélectionné un dossier windows, le message d'erreur suivant s'affiche dans la console MATLAB :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ??? Undefined variable "handles" or class "handles.editTag3".
     
    Error in ==> Interface2>pushbuttonI_Callback at 367
        set(handles.(edit_tag), 'String', directory);
     
    ??? Error while evaluating uicontrol Callback
    C'est bizarre vu qu'il me semble que handles.editTag3 existe bien...
    si j'insère les lignes suivantes à ma fonction pushbutton7_Callback,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     handles = guihandles;
     set(handles.editTag3, 'String', 'test');
    La première me renvoie bien la liste des tags des handles (dont mes fameux pushTag1, editTag1, pushTag2, editTag2, pushTag3, editTag3, etc..)
    La seconde affiche bien 'test' dans l'edittext tagué editTag3...

    On dirait donc que la fonction pushbuttonI_Callback ne "voit" pas mes tags...

  6. #6
    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
    Cela n'a rien d'étonnant la variable handles étant inconnue dans la fonction pushbuttonI_Callback.

    1ère chose : il faut :
    - soit que tu regénères la structure handles puisque tu as créé de nouveaux objets (avec GUIHANDLES). N'étant pas familière de cette façon de faire, je ne sais pas s'il y aura des effets de bord.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    handles=guihandles(gcf);
    guidata(gcf,handles);
    - soit que tu mettes à jour "à la main" la structure handles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for i = 1:b
       %...
       handles.(string)=uicontrol('style','text',...)
       %idem pour les edit et les pushbutton
    end
    guidata(gcf,handles);
    Puis tu récupères la structure handles dans la fonction pushbuttonI_Callback avec GUIDATA :

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2009
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    J'ai choisi la première méthode.
    Mon application fonctionne maintenant!

    Le code est le suivant, si ca interesse quelqu'un..

    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
    % --- Executes on button press in pushbutton7.
    function pushbutton7_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton7 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    a = 100;
    b = str2double(get(handles.edit7, 'String'));
    fig = figure('Name', 'Propriétés des jeux d''images', 'NumberTitle', 'off', 'MenuBar', 'figure', 'Color', [0.925 0.914 0.847], 'Position', [360 502 400 a*b]);
    movegui(fig,'center')
    c = 10;
    for i = 1:b
        j = num2str(i);
        string = ['Folder' j];
        uicontrol('Style', 'text', 'Position', [20 c+30 40 20], 'HorizontalAlignment', 'left', 'Tag', string, 'String', string, 'Parent', fig, 'BackgroundColor', [0.925 0.914 0.847], 'ForegroundColor', [0 0 0]);
        editTag = ['editTag' j];
        uicontrol('Style', 'edit', 'String', '', 'Position', [20 c 360 20], 'HorizontalAlignment', 'left', 'Tag', editTag, 'Parent', fig, 'BackgroundColor', [1 1 1], 'ForegroundColor', [0 0 0]);
        pushTag = ['pushTag' j];
        uicontrol('Style', 'pushbutton', 'Position', [80 c+30 70 22], 'Tag', pushTag, 'Callback', @pushbuttonI_Callback, 'String', 'Parcourir', 'Parent', fig, 'BackgroundColor', [1 1 1], 'ForegroundColor', [0 0 0]);    
        c = c+100;
    end
        % handles = guihandles;
     
    function pushbuttonI_Callback(hObject, event)
        handles=guihandles(gcf);
        guidata(gcf,handles);
        directory = uigetdir();
        pb_tag = get(hObject, 'Tag');
        edit_tag = strrep(pb_tag, 'push', 'edit');
        set(handles.(edit_tag), 'String', directory);
    Merci beaucoup à tous les deux!

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 28/10/2005, 13h48
  2. problème d'accès a des éléments créés dynamiquement
    Par Pymm dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 21/07/2005, 17h13
  3. Gestion séparée de composants créés dynamiquement
    Par anarpunk dans le forum Composants VCL
    Réponses: 8
    Dernier message: 15/06/2005, 10h57
  4. Réponses: 5
    Dernier message: 12/07/2004, 21h00
  5. Erreur EACCESSVIOLATION avec des compsts créés dynamiquement
    Par tsikpemoise dans le forum Bases de données
    Réponses: 4
    Dernier message: 28/02/2004, 19h05

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