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 :

Comment faire une interface GUI comme celle ci ? (voir sujet)


Sujet :

Interfaces Graphiques

  1. #21
    Invité
    Invité(e)
    Par défaut
    Nan effectivement t'avais bien compris, c'est l'utilisateur qui les rentrent mais qui sont des variables de base qui vont être utilisées dans toutes les fonctions.

    Mais sinon pour les variables internes avec handles.var1=[] après dans les fonctions je mets var1 ou handles.var1 ?

    EDIT: au fait ça marche ce que tu m'as donnée, bon pour moi c'est encore une enigme les arguments des fonction (objet, gfc, htab,evdt,hpanel,hstatus ...) mais bon si ça marche comme ça ...

  2. #22
    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 830
    Points
    14 830
    Par défaut
    Citation Envoyé par bizounours94 Voir le message
    Nan effectivement t'avais bien compris, c'est l'utilisateur qui les rentrent mais qui sont des variables de base qui vont être utilisées dans toutes les fonctions.
    Dans ce cas tu enregistres les valeurs après qu'elles aient été rentrées (dans le callback d'un objet donc tu es sur que si on agit sur cet objet toutes les valeurs ont été rentrées)

    Citation Envoyé par bizounours94 Voir le message
    Mais sinon pour les variables internes avec handles.var1=[] après dans les fonctions je mets var1 ou handles.var1 ?
    handles.var1

    Citation Envoyé par bizounours94 Voir le message
    EDIT: au fait ça marche ce que tu m'as donnée, bon pour moi c'est encore une enigme les arguments des fonction (objet, gfc, htab,evdt,hpanel,hstatus ...) mais bon si ça marche comme ça ...
    Alors les arguments c'est un peu flou.
    En fait c'est le système de function handle (le @) qui fait ça.
    Si tu regardes dans un code généré par GUIDE tu dois récupéré les infos pour les 3 1ers (pour le 4ème il faut le définir, c'est pas clair je sais mais c'est pas grave, tu n'en utilises aucun dans ton code) :

    • hObject : le handle de l'objet courant (celui sur lequel on agit)
    • evt : un truc qui sert pas mais The Mathworks prévoit de l'utiliser un jour, on est obligé de le prendre même si il n'y a rien dedans
    • handles : la structure handles. Normalement c'est la même que celle renvoyée par GUIDATA mais pas toujours Donc dans le doute mieux vaut la récupérer avec GUIDATA
    Règles du Forum

    Adepte de la maïeutique

  3. #23
    Invité
    Invité(e)
    Par défaut
    ce que je pige pas, c'est que je fais exactement la même chose et quand j'appelle les handles d'une autre fonction (ou j'ai bien mis guidata(gcf,handles)) bah il les trouvent pas. J'ai beau chercher je vois pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ??? Reference to non-existent field 'scanner_popmenu'.
     
    Error in ==> panel>Scanner_Choix at 559
    switch get(handles.scanner_popmenu,'Value')
     
    ??? Error while evaluating uicontrol Callback


    J'ai un autre problème aussi:

    j'ai fais ça pour la courbe, ça marche très bien
    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
    function button(objet, handles)
    handles = guidata(gcf);
     
    set(handles.button,'backgroundcolor',rand(1,3));
    axes(handles.axe);
    %creates a vector from 0 to 10, [0 1 2 3 . . . 10]
    x = 0:10;
    %creates a vector from 0 to 10, [0 1 2 3 . . . 10]
    y = rand(1,11);
     
    %plots the x and y data
    plot(x,y);
    %adds a title, x-axis description, and y-axis description
    title('Axes 1');
    xlabel('X data');
    ylabel('Y data');
     
     
    % afficher une courbe aussi
    guidata(objet, handles); %updates the handles
    ensuite j'ai fait une 2eme fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    function Lentille_Choix(objet, handles)
    handles = guidata(gcf);
    a=get(handles.text,'string');
    disp(a);
    guidata(objet, handles);
    Et la ça m'affiche bien a mais en plus ça change la couleur du bouton et la courbe (nouveau rand) alors que logiquement je l'ai pas demandé, y'a pas de raison que ça exécute la fonction button ...

    Du coup je me demande si c'est pas un problème d'argument justement.

  4. #24
    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 830
    Points
    14 830
    Par défaut
    Attention GUIDATA s'utilise de 2 façons, il ne faut pas les mélanger :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    %Enregistrer la structure handles dans la figure :
    guidata(gcf,handles);
     
    %Récupérer la structure handles précédemment enregistrée :
    handles = guidata(gcf);
    Pour être sur il faut écrire le 2èle code à chaque début de sous-fonction, et la 1ère à chaque fin de sous-fonction et à la fin de la fonction principale.
    Presque comme tu as fait sur les 2 sous-fonctions que tu montres à part qu'il faudrait remplacer objet par gcf, ce serait plus sur.

    Pour ton 2ème problème, il faudrait savoir d'où sont appelées ces 2 fonctions (pour button je la vois dans le code que tu as fourni, mais la 2ème doit être nouvelle) : De quel objet cette fonction est-elle le Callback (ou autre *Fcn)
    Règles du Forum

    Adepte de la maïeutique

  5. #25
    Invité
    Invité(e)
    Par défaut
    Moué j'ai mis ça partout mais ça change rien, je sais pas ce qui cloche dans les 2 cas, j'ai mis le code en PJ.

    En fait meme en appuyant sur entrer après avoir saisi quelque chose ça actualise la courbe. Alors la effectivement c'est pas grave parce que c'est une courbe bidon, mais si a chaque fois que l'utilisateur fait quelque chose ça change des valeurs qui n'étaient pas sensé être changée ou alors que ça recalcule une courbe qui met 10 min à être générée c'est beaucoup plus ennuyeux.
    Fichiers attachés Fichiers attachés
    Dernière modification par Caro-Line ; 26/06/2009 à 15h03.

  6. #26
    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 830
    Points
    14 830
    Par défaut
    Parce que tu en as oublié

    Dans CreateStep, pas de GUIDATA au début, et "handles = guidata(gcf);" au lieu de "guidata(gcf,handles);" à la fin.

    [EDIT] Et aussi au début de Step1.

    Le truc c'est que si tu ne récupères pas la struture à jour au début d'une sous-fonction, tu repars à zéro et tu vas donc créer une nouvelle structure uniquement avec les champs définis dans la sous-fonction.

    [EDIT encore] Ah non en fait dans CreateStep il ne faut surtout pas mettre de GUIDATA puisque tu ne touches pas à la structure handles. C'est dans Step1 l'important.
    Règles du Forum

    Adepte de la maïeutique

  7. #27
    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 830
    Points
    14 830
    Par défaut
    Et pour finir pour ton histoire de courbe qui change : button sera aussi appelée à chaque fois que tu modifies la valeur dans l'objet edit au-dessus du bouton car :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    handles.text=uicontrol(...
        'parent',Step1_Panel(1),...
        'style','edit',...
        'units','normalized',...
        'position',[0.1,0.4,0.05,0.02],...
        'callback',@button);
    Par contre l'appel à lentille_choix (par sélection du popup dans le bloc lentille) ne fait rien d'autre que le display du nombre chez moi.
    Règles du Forum

    Adepte de la maïeutique

  8. #28
    Invité
    Invité(e)
    Par défaut
    aaaaaaahhhhhh c'est un copier coller malheureux ... chui bête

    Merci ^^

    Sinon je pige pas pourquoi on doit mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    handles = guidata(gcf);
    guidata(gcf,handles);
    sauf dans createstep et createdonnes, moi j'aurais mis guidata(gcf,handles); partout (createfcn) et handles = guidata(gcf);guidata(gcf,handles); dans les fonction callback
    Dernière modification par Caro-Line ; 26/06/2009 à 14h57. Motif: SMS, langage familier, balises code

  9. #29
    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 830
    Points
    14 830
    Par défaut
    Je t'ai donné la méthode "bourrin" pour aller plus vite ce qui m'a fait faire des bêtises.

    Il faut mettre :
    au début de chaque sous-fonction qui :

    • Modifie la structure handles
    • A besoin d'utiliser la structure handles

    Il faut mettre :
    à la fin de chaque sous-fonction qui :

    • Modifie la structure handles (ajout d'un champ ou modification d'une valeur).


    Les problèmes arrive lorsqu'il y a plusieurs fonctions imbriquées. Dans ton cas CreateStep appelle des sous-fonctions (Step(i) ) qui vont chaune modifier la structure handle. Alors que CreateStep ne va pas la modifier, donc les GUIDATA ne sont pas nécessaires.

    Si tu avais aussi modifier la structure handles dans CreateStep, là ce serait devenu lourd puisqu'il aurait fallu mettre à jour la structure et la récupérer avant et après chaque appel à une sous-fonction.

    Ce qu'il faut comprendre c'est que chaque sous-fonction à son environnement personnel et ne sait rien de la fonction parente.
    Je sens que ce n'est pas clair mais ce serait assez long à expliquer...
    Le mieux pour comprendre serait d'utiliser le Debuggueur en mode pas-à-pas pour voir comment MATLAB fonctionne.
    Règles du Forum

    Adepte de la maïeutique

  10. #30
    Invité
    Invité(e)
    Par défaut
    Ok merci, j'vais partir sur ce que tu me dis en espérant que ça ne bug pas trop

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

    J'ai encore quelques soucis de 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
    function Step3_Calcul(gcf,handles)
    handles = guidata(gcf);
     
    load User_Specs.mat  
    [diam_mini_faisceau,Wth,W_waist,zrayleigh_th,zrayleigh]=Laser_Perf(Lambda_faisceau,dist_focale,get(handles.Step3_Slide_Diam,'value')/1000,M2);
    load User_step2.mat
    load geometrie.mat
    tic
     
    handles.Step3_Results_X=linspace(Decal_X-P_Long,Decal_X+P_Long,70);
    handles.Step3_Results_Y=linspace(-G_Long,G_Long,70);
    handles.Step3_Results=zeros(length(handles.Step3_Results_X),length(handles.Step3_Results_Y));
    for i=1:length(handles.Step3_Results_X)
        for j=1:length(handles.Step3_Results_Y)
       handles.Step3_Results(i,j)=Fluence2(handles.Step3_Results_X(i),handles.Step3_Results_Y(j),theta,Hmax,hauteur_source,zrayleigh,W_waist,correction_focale,dist_galva,dist_focale,Decal_X,G_Lag,P_Lag,G_Long,P_Long,freq_faisceau,Pmoy_faisceau)/10000;    
        end
    end
     
    toc
    Step3_Affichage(gcf,handles);
    guidata(gcf,handles); %updates the handles
     
     
    function Step3_Affichage(gcf, handles)
    handles = guidata(gcf);
    axes(handles.fluence_axe);
    switch get(handles.fluence_popmenu,'Value')
        case 1 %fluence
           a= handles.Step3_Results;
           b= get(handles.Step3_Slide_Puissance,'value');
           c= get(handles.Step3_Slide_Repet,'value')/1000;
           A=a*b/c;
           surf(handles.Step3_Results_X*1000,handles.Step3_Results_Y*1000,A');
        case 2
     
     
        case 3
     
    end
    guidata(gcf,handles); %updates the handles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ??? Reference to non-existent field 'Step3_Results'.
     
    Error in ==> panel>Step3_Affichage at 1823
           a= handles.Step3_Results;
     
    Error in ==> panel>Step3_Calcul at 1814
    Step3_Affichage(gcf,handles);
     
    Error in ==> panel>Step3_Change_Diam1 at 1874
    Step3_Calcul(gcf,handles);
    Voila l'erreur quand j'exécute Step3_Calcul, je comprends pas pourquoi il n'envoie pas la valeur de handles.Step3_results dans l'autre fonctions. Normalement avec handles, les variables sont visibles de tous.

  12. #32
    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 830
    Points
    14 830
    Par défaut
    Et c'est toujours la même chose

    Quand tu appelles Step3_Affichage dans Step3_Calcul, tu lui passes en paramètre la variable handles à laquelle tu as donc rajouté un certain nombre d'informations.
    Par contre tu n'as pas encore mis à jour la variable dans le guidata de gcf.
    Donc le handles passé en argument est le bon (la version la plus à jour) alors que handles de guidata(gcf) est le même que celui récupéré au début de Step3_Calcul.
    Vu que tu ne fais aucune modification de handles dans Step3_Affichage, je te conseille d'enlever les 2 lignes avec GUIDATA (la 1ère et la dernière) et cela devrait fonctionner.
    Règles du Forum

    Adepte de la maïeutique

  13. #33
    Invité
    Invité(e)
    Par défaut
    Effectivement ça marchait quand j'inversais ces 2 lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Step3_Affichage(gcf,handles);
    guidata(gcf,handles); %updates the handles
    mais en fait ça ne faisait que déplacer le problème, ensuite quand j'appelais juste Step3_Affichage(gcf,handles); ça me disait que handles.Step3_Results n'existait pas.


    J'ai essayé de virer des guidata, mais ça ne marche pas, j'ai pas du très bien comprendre
    Dernière modification par Caro-Line ; 06/07/2009 à 16h28. Motif: Ajout balises code => sélection code puis bouton #

  14. #34
    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 830
    Points
    14 830
    Par défaut
    Tu ne changes rien à Step3_Calcul et pour l'autre essaye :
    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 Step3_Affichage(gcf, handles)
    %handles = guidata(gcf);
    axes(handles.fluence_axe);
    switch get(handles.fluence_popmenu,'Value')
        case 1 %fluence
           a= handles.Step3_Results;
           b= get(handles.Step3_Slide_Puissance,'value');
           c= get(handles.Step3_Slide_Repet,'value')/1000;
           A=a*b/c;
           surf(handles.Step3_Results_X*1000,handles.Step3_Results_Y*1000,A');
        case 2
     
     
        case 3
     
    end
    %guidata(gcf,handles); %updates the handles
    Règles du Forum

    Adepte de la maïeutique

  15. #35
    Invité
    Invité(e)
    Par défaut
    j'avais bien compris, du coup ça donne une autre erreure dans une autre fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ??? Reference to non-existent field 'Step3_Results'.
     
    Error in ==> panel>Step3_Affichage at 1847
           a= handles.Step3_Results;
     
    Error in ==> panel>slider1 at 1921
    Step3_Affichage(gcf,handles);
     
    ??? Error while evaluating uicontrol Callback
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function slider1(gcf, handles)
    handles = guidata(gcf);
    %obtains the slider value from the slider component
    sliderValuePuissance = get(handles.Step3_Slide_Puissance,'Value');
    sliderValueRepet = get(handles.Step3_Slide_Repet,'Value');
    sliderValueDiam = get(handles.Step3_Slide_Diam,'Value');
    %puts the slider value into the edit text component
    set(handles.Step3_Slidtext_Puissance,'String', num2str(sliderValuePuissance));
    set(handles.Step3_Slidtext_Repet,'String', num2str(sliderValueRepet));
    set(handles.Step3_Slidtext_Diam,'String', num2str(sliderValueDiam));
    % Update handles structure
     
    guidata(gcf, handles);
    Step3_Affichage(gcf,handles);

  16. #36
    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 830
    Points
    14 830
    Par défaut
    D'accord je n'avais pas compris que cette fonction pouvait être appelée depuis une autre fonction.

    Mais lors de l'appel à slider1, Step3_Calcul a été effectué au moins une fois ?
    Car il faut cela pour que le champ Step3_Results ait été instancié.
    Règles du Forum

    Adepte de la maïeutique

  17. #37
    Invité
    Invité(e)
    Par défaut
    il y a d'abord la fonction calcul qui est faite puis affiche, ensuite on peut modifier affiche ou calcul qui va à son tour modifier affiche.

  18. #38
    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 830
    Points
    14 830
    Par défaut
    Dans ce cas cela devrait fonctionner je ne comprends pas.

    Il faudrait que tu debuggues en pas à pas pour vérifier dans quel ordre toutes ces fonctions sont appelées.
    Soit tu utilises le débuggueur, soit tu fais des DISP dans chaque fonction.
    Règles du Forum

    Adepte de la maïeutique

  19. #39
    Invité
    Invité(e)
    Par défaut
    ça devrait fonctionner avec ou sans les guidata ?

  20. #40
    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 830
    Points
    14 830
    Par défaut
    Sans les GUIDATA puisque dans slider1 tu passes la structure handles mise à jour à Step3_Affichage.

    Mais pour cela il faut que la structure handles récupérée dans slider1 par GUIDATA soit bien celle qui a été mise à jour à la fin de Step3_Calcul (au moins).
    Règles du Forum

    Adepte de la maïeutique

Discussions similaires

  1. Comment faire une table-arbre comme celle de la view "Problèmes" ?
    Par leonelag dans le forum Eclipse Platform
    Réponses: 6
    Dernier message: 21/08/2007, 12h56
  2. peux je faire une interface java comme vb.net
    Par mini-Informaticien dans le forum 2D
    Réponses: 2
    Dernier message: 05/05/2007, 00h40
  3. Comment faire une interface de ce type....
    Par SpiderAlpha dans le forum C++Builder
    Réponses: 6
    Dernier message: 30/04/2007, 13h50
  4. [Débutant] Comment faire une interface graphique ?
    Par hanane78 dans le forum Interfaces Graphiques
    Réponses: 1
    Dernier message: 29/12/2006, 09h43

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