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

Tkinter Python Discussion :

Class avec python et Tkinter


Sujet :

Tkinter Python

  1. #21
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 132
    Points : 130
    Points
    130
    Par défaut
    Merci pour ces précisions, une bonne nouvelle j'ai compris votre code.

    Pour ce qui est de la class, n'étant pas très allaise j'ai essayé quelque chose qui je crois ne fonctionne pas jusqu'au bout. Il y a un problème d'indice dans la fonction remonter()
    Faut-il utiliser la liste QA pour enchainer les questions, même sans retour ? car pour l'heure les questions se suivent juste par la liste Q

    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
    import tkinter as tk
     
    frame_clicked = None
    class noeud :
        def suppression_frame(row,ix):
            global QA
            QA = [0, [2, [4, 5 ]], [1, [5, 3]]]
            for f in range (row+1,ix+1):
                frames[f].destroy()
                frames.remove(f)
        def remonter(answer,row,ix):
            if answer=='1':
                ix=QA[ix][row]
                return ix
            else :
                ix=QA[ix][row]
                return ix
     
    def on_select(frame):
        global frame_clicked
     
        frame_clicked = frame
        root.after_idle(root.quit)
     
    def ask_question(text):
     
        frame = tk.Frame(root)
        frame._answer = v = tk.IntVar(frame, value=0)
        tk.Label(frame, text=text, width=30).grid(row=0, column=0)
     
        cmd = lambda: on_select(frame)
        b1 = tk.Radiobutton(frame, text="Yes", variable=v, value='1', command=cmd)
        b1.grid(row=1,column=0)
     
        b2 = tk.Radiobutton(frame, text="No", variable=v, value='2', command=cmd)
        b2.grid(row=1,column=1)
     
        return frame
     
    if __name__=='__main__':
        Q = ['ça va ?','a cause du mauvais temps ?','il fait beau?',"envie d'en parler ?",'il y a du soleil ?','il y a de la pluie ?']
        root = tk.Tk()
     
        ix = 0
        frames = []
        while 1:
            frame = ask_question(Q[ix])
            frame.grid(row=ix)
            frames.append(frame)
            root.mainloop()
            row = frames.index(frame_clicked)
            answer=frame_clicked._answer.get()
            print('index:', ix, 'row clicked:', row, 'answer:',answer)
            if row == ix:
                ix += 1
                if ix == len(Q):
                    break
            else:
                noeud.suppression_frame(row,ix)
                noeud.remonter(answer,row,ix)
    dans suppression_ frame : J'évite de suprrimer la ligne concerné, et supprime toutes celles d'apres.
    Viens apres remonter() où en fonction de la réponse de frame_clicked._answer.get() on vient choisir d'où repartir dans QA. Et la problème ....

    Merci pour votre temps,

    Valentin.

  2. #22
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 273
    Points : 36 757
    Points
    36 757
    Par défaut
    Citation Envoyé par StabiloHB Voir le message
    Pour ce qui est de la class, n'étant pas très allaise j'ai essayé quelque chose qui je crois ne fonctionne pas jusqu'au bout. Il y a un problème d'indice dans la fonction remonter()
    Faut-il utiliser la liste QA pour enchainer les questions, même sans retour ? car pour l'heure les questions se suivent juste par la liste Q
    mouais, structures de données et algorithmes ne sont pas votre fort.
    Il va falloir travailler tout çà.

    Ci dessous, voilà comment utiliser QA que j'ai pompeusement rebaptisé TREE et modifié quelque peu pour définir les feuilles (de l'arbre).


    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    import tkinter as tk
     
    frame_clicked = None
     
    def on_select(frame):
        global frame_clicked
     
        frame_clicked = frame
        root.after_idle(root.quit)
     
    def ask_question(text):
     
        frame = tk.Frame(root)
        frame._answer = v = tk.IntVar(frame, value=0)
        tk.Label(frame, text=text, width=30).grid(row=0, column=0)
     
        cmd = lambda: on_select(frame)
        b1 = tk.Radiobutton(frame, text="Yes", variable=v, value='1', command=cmd)
        b1.grid(row=1,column=0)
     
        b2 = tk.Radiobutton(frame, text="No", variable=v, value='2', command=cmd)
        b2.grid(row=1,column=1)
     
        return frame
     
     
     
    if __name__=='__main__':
        Q = ['ça va ?','a cause du mauvais temps ?','il fait beau?',
             "envie d'en parler ?",'il y a du soleil ?','il y a de la pluie ?']
     
        TREE = (0,
            (1,
             (4, -1, -1),
             (5, -1, -1)
             ),
            (2,
             (5, -1, -1),
             (3, -1, -1)
             )
            )    
        root = tk.Tk()
     
        ix = 0
        frames = []
        tree = TREE
        while 1:
            n, left, right = tree  # numéro de la question, sous-arbre Yes, sous-arbre No
            frame = ask_question(Q[n])
            frame._tree = tree # on stocke le sous arbre pour le retour arrière.
            frame.grid(row=ix)
            frames.append(frame)
            root.mainloop()
     
            row = frames.index(frame_clicked)
            print('index:', ix, 'row clicked:', row, 'answer:', frame_clicked._answer.get())
            if row == ix:
                ix += 1
                if (left, right) == (-1, -1):
                    break
            else:
                row += 1
                for w in (reversed(frames[row:])):
                    w.destroy()
                    frames.remove(w)
                tree = frame_clicked._tree  # récupère le s/arbre
                _ , left, right = tree      # re-définit s/arbre Yes, s/arbre No
                ix = row                    # on remet à jour l'index.
            answer = frame_clicked._answer.get()   # le s/arbre suivant 
            tree = right if answer == 1 else left  # dépend de la réponse...
    note: vous voyez que c'est presque le même code que dans le cas précédent auquel j'ai ajouté la navigation dans "tree" en fonction de la réponse.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #23
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 132
    Points : 130
    Points
    130
    Par défaut
    Merci pour votre réponse,

    Un peu deçu de ne pas y être arrivé...
    Je voudrai juste savoir si j'ai bien compris ce que le programme fait :

    Le "tree" diminue au fur et a mesure que l'on descend dans l'arbre ? Et la fin est (-1,-1) ?

    Théoriquement si je veux rajouter des questions il suffit de changer "TREE" et Q[] ?

    Merci encore pour votre temps et votre patience, je reposterai surement un Code avec une généralisation en class quand j'y serai parvenu.

    Valentin.

  4. #24
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 273
    Points : 36 757
    Points
    36 757
    Par défaut
    Citation Envoyé par StabiloHB Voir le message
    Le "tree" diminue au fur et a mesure que l'on descend dans l'arbre ? Et la fin est (-1,-1) ?
    Techniquement TREE ne bouge pas.
    La variable tree est juste un pointeur vers le s/arbre associé/correspondant à la question.
    Lorsque ce s/arbre na plus de fils i.e. (left, right) == (-1, -1), on est arrivé à une feuille: on sort.

    Citation Envoyé par StabiloHB Voir le message
    Théoriquement si je veux rajouter des questions il suffit de changer "TREE" et Q[] ?
    Voilà: les données d'un côté et le code qui se balade dedans de l'autre. Vous pouvez changer les données qui "dirigent" le code. Et çà va fonctionner si vous respectez la structure attendue par le code qui mouline dessus.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #25
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 132
    Points : 130
    Points
    130
    Par défaut
    Bonjour,

    Citation Envoyé par wiztricks Voir le message
    Techniquement TREE ne bouge pas.
    Oui d'accord c'est left et right.

    Citation Envoyé par wiztricks Voir le message
    Vous pouvez changer les données qui "dirigent" le code. Et çà va fonctionner si vous respectez la structure attendue par le code qui mouline dessus.
    Sois je n'ai pas encore tout saisis, ce qui est fort possible, sois l'arbre doit forcement être avec des branches de tailles identiques. Car la condition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (left , right) == (-1, -1):
    Nous oblige à avoir left et right = à (-1,-1).
    Car par exemple si on veut quitter si la premiere réponse est "No" et continuer sur d'autres questions si "Yes", le programme marche très bien dans le second cas tant dis ce qu'il plante dans le premier car il lui manque l'argument de la question.
    Voilà mon nouveau TREE je l'ai surement mal organisé.. pour le "NO" mais c'est que je ne veut pas lui demander d'autre question pour ça qu'il manque un argument :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TREE=(0,(-1,-1),(1,-1,-1))
    Merci pour votre temps,

    Valentin.

  6. #26
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 273
    Points : 36 757
    Points
    36 757
    Par défaut
    Citation Envoyé par StabiloHB Voir le message
    Sois je n'ai pas encore tout saisis, ce qui est fort possible, sois l'arbre doit forcement être avec des branches de tailles identiques. Car la condition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (left , right) == (-1, -1):
    Nous oblige à avoir left et right = à (-1,-1).
    Si branche == sous-arbre alors ils peuvent avoir une profondeur différente.
    Mais left et right étant les s/arbres correspondant aux réponses Yes/No données à la question courante, il faut bien coder "fin" d'une façon ou d'une autre.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #27
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 132
    Points : 130
    Points
    130
    Par défaut
    J'ai palié ça avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    n, left, right = tree  # numéro de la question, sous-arbre Yes, sous-arbre No
            if n==123 :
                print(list_answer)
                recommencer=tk.Button(frame_question,text='Restart',command=restart).grid(row=0,column=1)
                break
    Donc si on met :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TREE=(0,(123,-1,-1),(1,-1,-1))
    au deuxieme tour il verra que n=132 donc il s'arretera, pas très propre mais ça marche.

    Merci pour votre temps,

    Valentin.

  8. #28
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 273
    Points : 36 757
    Points
    36 757
    Par défaut
    ah oui, je vois mieux le soucis.
    Dans ce cas, il faut tester autrement l'arrivée sur une feuille:
    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
     
    if __name__=='__main__':
        Q = ['ça va ?','a cause du mauvais temps ?','il fait beau?',
             "envie d'en parler ?",'il y a du soleil ?','il y a de la pluie ?']
     
        TREE = (0,
            -1,
            (2,
             (5, -1, -1),
             (3, -1, -1)
             )
            )    
        root = tk.Tk()
     
        ix = 0
        frames = []
        tree = TREE
        while 1:
            n, left, right = tree  # numéro de la question, sous-arbre Yes, sous-arbre No
            frame = ask_question(Q[n])
            frame._tree = tree # on stocke le sous arbre pour le retour arrière.
            frame.grid(row=ix)
            frames.append(frame)
            root.mainloop()
     
            row = frames.index(frame_clicked)
            print('index:', ix, 'row clicked:', row, 'answer:', frame_clicked._answer.get())
            if row == ix:
                ix += 1
                ## if (left, right) == (-1, -1):
                ##     break
            else:
                row += 1
                for w in (reversed(frames[row:])):
                    w.destroy()
                    frames.remove(w)
                tree = frame_clicked._tree  # récupère le s/arbre
                _ , left, right = tree      # re-définit s/arbre Yes, s/arbre No
                ix = row                    # on remet à jour l'index.
            answer = frame_clicked._answer.get()   # le s/arbre suivant 
            tree = right if answer == 1 else left  # dépend de la réponse...
            if tree == -1:
               break
    note: on regarde simplement si le root est devenu -1 pour sortir plutôt qu'au changement de niveau.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #29
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 132
    Points : 130
    Points
    130
    Par défaut
    Ah oui pas bête cela évite un début de boucle supplémentaire en plus !

    Merci,

    Valentin.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Interface graphique avec python et tkinter
    Par MrTGR57 dans le forum Tkinter
    Réponses: 0
    Dernier message: 23/04/2014, 17h10
  2. Snake avec Python 3.0 et Tkinter
    Par tonykart13 dans le forum Tkinter
    Réponses: 18
    Dernier message: 10/06/2012, 21h55
  3. Commencer avec les classes en Python
    Par Ismatus1 dans le forum Linux
    Réponses: 1
    Dernier message: 16/11/2011, 19h39
  4. La POO avec python Tkinter
    Par alberth dans le forum Tkinter
    Réponses: 2
    Dernier message: 06/05/2009, 14h53

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