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 :

Exécuter plusieurs Frames en même temps


Sujet :

Tkinter Python

  1. #1
    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 Exécuter plusieurs Frames en même temps
    Bonjour à tous,

    J'ai ce code, extrait d'un précédent Post, je remercie d'ailleur @wiztricks de m'avoir beaucoup aidé.
    Le principe, c'est un enchainement de question en cascade avec des réponses "yes" et "no". Le programme suit une arborescence TREE par raport à une liste de question Q. tel que tree soit sous la forme : (question,no,yes).
    Voici le code original :
    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...
    J'essaie maintenant de l'adapter à un autre programme. Pour ce faire j'ai modifié de tel sorte d'appeler une fonction (main()), j'ai créé une frame_question placé dans le root. Voici le code modifié :
    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
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    import tkinter as tk
     
    frame_clicked = None
     
    def restart():
        frame_question.destroy()
        main()
     
    def on_select(frame):
        global frame_clicked
     
        frame_clicked = frame
        frame_question.after_idle(frame_question.quit)
     
    def ask_question(text):
     
        frame = tk.Frame(frame_question)
        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
     
     
    def main():
        global frame_question
    ##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)
    ##         )
    ##        )
        Q=['Does the team is defined ? ','Does the capacity is confirmed ? ']
        TREE=(0,(123,-1,-1),(1,-1,-1))
        frame_question=tk.Frame(root)
        frame_question.grid(row=0,column=0)
        list_answer=[]
        ix = 0
        frames = []
        tree = TREE
        while 1:
            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
            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)
            frame_question.mainloop()
     
            row = frames.index(frame_clicked)
            list_answer.insert(row,frame_clicked._answer.get())
            if row == ix:
                ix += 1
                if (left, right) == (-1, -1):
                    print(list_answer)
                    recommencer=tk.Button(frame_question,text='Restart',command=restart).grid(row=0,column=1)
                    break
            else:
                row += 1
                for w in (reversed(frames[row:])):
                    w.destroy()
                    frames.remove(w)
                for i in (reversed(list_answer[row:])):
                    list_answer.remove(i)
                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...
     
    root=tk.Tk()
    main()
    continuer=tk.Button(root,text='continuer',command='').grid(row=0,column=1)
    Je voudrai maintenant placer d'autres choses dans le root. Cependant si je lance la fonction main(), le programme vient se bloquer logiquement dans le :
    Comment palier à ce problème ? Dans le but de mettre plusieurs question de ce type en même temps dans des frames différentes style : frame_question_n°. Avec pourquoi pas une généralisation du main() qui prendrait des arguments tel que la frame de la question, la liste et l'arbre des questions. Un bouton est facile à mettre il suffit de le creer avant de lancer le main().

    Merci d'avance,

    Valentin.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par StabiloHB Voir le message
    Je voudrai maintenant placer d'autres choses dans le root. Cependant si je lance la fonction main(), le programme vient se bloquer logiquement dans le :
    Comment palier à ce problème ? Dans le but de mettre plusieurs question de ce type en même temps dans des frames différentes style : frame_question_n°. Avec pourquoi pas une généralisation du main() qui prendrait des arguments tel que la frame de la question, la liste et l'arbre des questions. Un bouton est facile à mettre il suffit de le creer avant de lancer le main()
    Ici, à l'instant t, vous avez une liste de questions "actives" dont on ne sort qu'en ayant terminé (i.e. lorsqu'on rencontre le "break").
    Si vous voulez avoir plusieurs listes de questions "actives", il va falloir sauvegarder/restaurer un état à partir de toutes les variables intéressantes (et probablement virer la boucle while).

    C'est un exercice intéressant pour se coltiner avec les facéties de tkinter... et puisqu'il y a plusieurs états "composites" voir comment utiliser les classes pour fabriquer çà.

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

  3. #3
    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
    puisqu'il y a plusieurs états "composites" voir comment utiliser les classes pour fabriquer çà.
    J'ai commencé un petit truc, je crois avoir compris le principe du self. Il sert bien à "instancifier" une variable ?

    Cependant je n'arrive pas à lancer le code car il me demande un attribut supplémentaire, je ne peux pourtant pas mettre le self en argument car il n'est pas connu dans le programme...

    Voici le code :
    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
    class question :
        def restart(self):
            self.frame_question.destroy()
     
        def on_select(self,frame):
            self.frame_clicked=self.frame
            self.frame_question.after_idle(self.frame_question.quit)
            self.main(self,Q,TREE)
     
        def construire(self,Q,TREE):
            self.frame_question=tk.Frame(root)
            self.frame_question.grid()
            self.list_answer=[]
            self.ix=0
            self.frames=[]
            self.tree=self.TREE
            main(Q,TREE)
     
        def ask_question(self,text):
            self.frame=tk.Frame(self.frame_question)
            self.frame._answer=self.v=tk.IntVar(self.frame,value=0)
            tk.Label(self.frame,text=text,widht=30).grid()
     
            self.cmd=lambda : self.on_select(self.frame)
            self.b1=tk.Button(self.frame,text='Yes',variable=self.v,value='1',command=self.cmd)
            self.b1.grid(row=1,column=0)
            self.b2=tk.Button(self.frame,text='No',variable=self.v,value='2',command=self.cmd)
            self.b2.grid(row=1,column=1)
     
            return self.frame
        def main(self):
            self.n,self.left,self.right=self.tree
            self.frame=self.ask_question(self.Q[n])
            self.frame.grid(row=self.ix)
            self.frame_question.mainloop()
     
            self.row=self.frames.index(self.frame_clicked)
            self.list_answer.insert(self.rox,self.frame_clicked._self.answer.get())
     
            if self.row==self.ix:
                self.ix+=1
                if (self.left,self.right)==(-1,-1):
                    print(self.list_answer)
                    return
            else :
                self.row+=1
                for w in (reversed(self.frames[self.row:])):
                    w.destroy()
                    self.frames.remove(w)
                for i in (reversed(self.list_answer[self.row:])):
                    self.list_answer.remove(i)
                self.tree=self.frame_clicked._self.tree
                _,self.left,self.right=self.tree
                self.ix=self.row
            self.answer=self.frame_clicked._self.answer.get()
            self.tree=self.right if self.answer==1 else self.left
     
    import tkinter as tk
    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)))
    question.construire(self,Q,TREE)
    Merci pour votre temps,

    Valentin.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par StabiloHB Voir le message
    J'ai commencé un petit truc, je crois avoir compris le principe du self. Il sert bien à "instancifier" une variable ?

    Cependant je n'arrive pas à lancer le code car il me demande un attribut supplémentaire, je ne peux pourtant pas mettre le self en argument car il n'est pas connu dans le programme...
    Les classes, c'est compliqué. Et compliqué signifie que vous ne pourrez pas piger çà en essayant n'importe quoi: il vous faut arrêter d'essayer de coder votre truc pour ouvrir un tuto. et prendre le temps d'apprendre ce que sont des classes, comment on les construit et comment on les utilise. Dans quelques jours/semaines, vous pourrez reprendre votre petit projet et essayer d'y appliquer les concepts que vous aurez appris.

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

  5. #5
    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
    Bon après une bonne lecture, je pense que je n'aurai pas le temps d'appliquer de manière poussée les class dans le cadre de mon emploi saisonnier.

    Merci de votre réponse, ce tuto m'a quand même appris quelques notions de class que je pourrai peut être utiliser l'an prochain pendant mon année en CPGE, sinon je vais me débrouiller autrement.

    Valentin.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    C'est pas si compliqué.
    D'abord on dégage le while:
    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
    71
    72
    73
    74
    75
    76
    77
    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_response(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,
            (2,
             (5, -1, -1),
             (3, -1, -1)
             )
            )    
        root = tk.Tk()
     
        ix = 0
        frames = []
        tree = TREE
     
        def next_question():
            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()
     
        def on_response(frame_clicked):
            global ix, tree
            row = frames.index(frame_clicked)
            print('index:', ix, 'row clicked:', row, 'answer:', frame_clicked._answer.get())
            if row == ix:
                ix += 1
     
            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.
            tree = frame_clicked._tree  # récupère le s/arbre
            _ , left, right = tree      # re-définit s/arbre Yes, s/arbre No
            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:
               root.quit()
            else:
                next_question()
        next_question()
        tk.mainloop()
    Ensuite on regroupe les fonctions créées dans une class "Dialog":
    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
    import tkinter as tk
     
    def ask_question(dialog, 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: dialog.on_response(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
     
    class Dialog:
        def __init__(self, questions, tree):
            self.ix = 0
            self.frames = []
            self.tree = tree
            self.questions = questions
     
        def next_question(self):
            n, left, right = self.tree  # numéro de la question, sous-arbre Yes, sous-arbre No
            frame = ask_question(self, self.questions[n])
            frame._tree = self.tree # on stocke le sous arbre pour le retour arrière.
            frame.grid(row=self.ix)
            self.frames.append(frame)
     
        def on_response(self, frame_clicked):
            row = self.frames.index(frame_clicked)
            print('index:', self.ix, 'row clicked:', row, 'answer:', frame_clicked._answer.get())
            if row == self.ix:
                self.ix += 1
            else:
                row += 1
                for w in (reversed(self.frames[row:])):
                    w.destroy()
                    self.frames.remove(w)
                self.ix = row                    # on remet à jour l'index.
            tree = frame_clicked._tree  # récupère le s/arbre
            _ , left, right = tree      # re-définit s/arbre Yes, s/arbre No
            answer = frame_clicked._answer.get()   # le s/arbre suivant 
            self.tree = right if answer == 1 else left  # dépend de la réponse...
            if self.tree == -1:
               root.quit()
            else:
               self.next_question()
     
     
    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()
     
     
        dialog = Dialog(Q, TREE)
        dialog.next_question()
        tk.mainloop()
    Puis on ouvre la possibilité à plusieurs dialogues:
    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
    71
    72
    import tkinter as tk
     
    def ask_question(dialog, text):
     
        frame = tk.Frame(dialog)
        frame._answer = v = tk.IntVar(frame, value=0)
        tk.Label(frame, text=text, width=30).grid(row=0, column=0)
     
        cmd = lambda: dialog.on_response(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
     
    class Dialog(tk.Frame):
        def __init__(self, master, questions, tree):
            super().__init__(master)
            self.ix = 0
            self.frames = []
            self.tree = tree
            self.questions = questions
     
        def next_question(self):
            n, left, right = self.tree  # numéro de la question, sous-arbre Yes, sous-arbre No
            frame = ask_question(self, self.questions[n])
            frame._tree = self.tree # on stocke le sous arbre pour le retour arrière.
            frame.grid(row=self.ix)
            self.frames.append(frame)
     
        def on_response(self, frame_clicked):
            row = self.frames.index(frame_clicked)
            print('index:', self.ix, 'row clicked:', row, 'answer:', frame_clicked._answer.get())
            if row == self.ix:
                self.ix += 1
            else:
                row += 1
                for w in (reversed(self.frames[row:])):
                    w.destroy()
                    self.frames.remove(w)
                self.ix = row                    # on remet à jour l'index.
            tree = frame_clicked._tree  # récupère le s/arbre
            _ , left, right = tree      # re-définit s/arbre Yes, s/arbre No
            answer = frame_clicked._answer.get()   # le s/arbre suivant 
            self.tree = right if answer == 1 else left  # dépend de la réponse...
            if self.tree == -1:
               root.quit()
            else:
               self.next_question()
     
     
    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()
     
     
        dialog = Dialog(root, Q, TREE)
        dialog.pack()
        dialog.next_question()
     
        tk.mainloop()
    Vous voyez, à chaque étape une petite variation.
    Mais il faut du temps pour maîtriser le pinceau et si vous n'avez pas la patience d'apprendre....

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

  7. #7
    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
    Effectivement quand on voit le resultat, il n'est pas si compliqué. Je dois surement manquer de patiente certe, mais je n'ai surement pas non plus la rigueur de quelqu'un qui sait programmer en OOP.

    Je tiens quand même à vous demandez quelques questions sur cette production pour entièrement la comprendre :

    Les self font des variable d'instance, ce sont les "dialog" qui les remplacent ensuite ?

    la fonction ask_question est bien héritière de la class Dialog ?

    Par contre une ligne que je ne comprend pas du tout :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    super().__init__(master)
    J'ai "continué" le programme en rajoutant une liste pour collecter les resultats, est ce qu'il est toujours bien dans l'esprit des class ?
    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
    71
    72
    73
    74
    75
    import tkinter as tk
     
    def ask_question(dialog, text):
     
        frame = tk.Frame(dialog)
        frame._answer = v = tk.IntVar(frame, value=0)
        tk.Label(frame, text=text, width=30).grid(row=0, column=0)
     
        cmd = lambda: dialog.on_response(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
     
    class Dialog(tk.Frame):
        def __init__(self, master, questions, tree):
            super().__init__(master)
            self.ix = 0
            self.frames = []
            self.tree = tree
            self.list_answer=[]
            self.questions = questions
     
        def next_question(self):
            n, left, right = self.tree  # numéro de la question, sous-arbre Yes, sous-arbre No
            frame = ask_question(self, self.questions[n])
            frame._tree = self.tree # on stocke le sous arbre pour le retour arrière.
            frame.grid(row=self.ix)
            self.frames.append(frame)
     
        def on_response(self, frame_clicked):
            row = self.frames.index(frame_clicked)
            print('index:', self.ix, 'row clicked:', row, 'answer:', frame_clicked._answer.get())
            self.list_answer.insert(row,frame_clicked._answer.get())
            if row == self.ix:
                self.ix += 1
            else:
                row += 1
                for w in (reversed(self.frames[row:])):
                    w.destroy()
                    self.frames.remove(w)
                for i in (reversed(self.list_answer[row:])):
                    self.list_answer.remove(i)
                self.ix = row                    # on remet à jour l'index.
            tree = frame_clicked._tree  # récupère le s/arbre
            _ , left, right = tree      # re-définit s/arbre Yes, s/arbre No
            answer = frame_clicked._answer.get()   # le s/arbre suivant 
            self.tree = right if answer == 1 else left  # dépend de la réponse...
            if self.tree == -1:
               root.quit()
            else:
               self.next_question()
     
     
    if __name__=='__main__':
        TREE = (0,(1,(3, -1, -1),(5, -1, -1)),(2,(5, -1, -1),(4, -1, -1)))
        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 ?']
        Q2=['Does the team is defined ? ','Does the capacity is confirmed ? ']
        TREE2=(0,-1,(1,-1,-1))
        root = tk.Tk()
     
        tk.Label(root,text='Question 1').grid(row=0,column=0)
        dialog = Dialog(root, Q, TREE)
        dialog.grid(row=1,column=0)
        tk.Label(root,text='Question 1').grid(row=2,column=0)
        dialog2=Dialog(root,Q2,TREE2)
        dialog2.grid(row=3,column=0)
        dialog.next_question()
        dialog2.next_question()
        tk.Button(root,text='continuer',command=lambda : print(dialog2.list_answer,dialog.list_answer)).grid(row=0,column=1)
     
        tk.mainloop()
    Merci pour votre temps,

    Valentin.

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par StabiloHB Voir le message
    Je tiens quand même à vous demandez quelques questions sur cette production pour entièrement la comprendre :

    Les self font des variable d'instance, ce sont les "dialog" qui les remplacent ensuite ?

    la fonction ask_question est bien héritière de la class Dialog ?
    ask_question est restée simple fonction et une fonction n'hérite de rien.
    Par contre on peut "promouvoir" ask_question en méthode de la class Dialog:

    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
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    import tkinter as tk
     
    ## def ask_question(dialog, text):
     
    ##     frame = tk.Frame(dialog)
    ##     frame._answer = v = tk.IntVar(frame, value=0)
    ##     tk.Label(frame, text=text, width=30).grid(row=0, column=0)
     
    ##     cmd = lambda: dialog.on_response(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
     
    class Dialog(tk.Frame):
        def __init__(self, master, questions, tree):
            super().__init__(master)
            self.ix = 0
            self.frames = []
            self.tree = tree
            self.questions = questions
     
        def ask_question(dialog, text):
     
            frame = tk.Frame(dialog)
            frame._answer = v = tk.IntVar(frame, value=0)
            tk.Label(frame, text=text, width=30).grid(row=0, column=0)
     
            cmd = lambda: dialog.on_response(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
     
        def next_question(self):
            n, left, right = self.tree  # numéro de la question, sous-arbre Yes, sous-arbre No
            frame = self.ask_question(self.questions[n])
            frame._tree = self.tree # on stocke le sous arbre pour le retour arrière.
            frame.grid(row=self.ix)
            self.frames.append(frame)
     
        def on_response(self, frame_clicked):
            row = self.frames.index(frame_clicked)
            print('index:', self.ix, 'row clicked:', row, 'answer:', frame_clicked._answer.get())
            if row == self.ix:
                self.ix += 1
            else:
                row += 1
                for w in (reversed(self.frames[row:])):
                    w.destroy()
                    self.frames.remove(w)
                self.ix = row                    # on remet à jour l'index.
            tree = frame_clicked._tree  # récupère le s/arbre
            _ , left, right = tree      # re-définit s/arbre Yes, s/arbre No
            answer = frame_clicked._answer.get()   # le s/arbre suivant 
            self.tree = right if answer == 1 else left  # dépend de la réponse...
            if self.tree == -1:
               root.quit()
            else:
               self.next_question()
     
     
    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()
     
     
        dialog = Dialog(root, Q, TREE)
        dialog.pack()
        dialog.next_question()
     
        tk.mainloop()
    Au delà de la déclaration, une différence entre fonction et méthode est dans le premier argument. Ici j'ai gardé "dialog" car "self" n'est que convention (qu'on essaie de s'efforcer de respecter histoire d'y retrouver ses petits). L'autre différence est que "self.ask_question" est un objet de type méthode où sont associé instance et fonction. Avec ask_question(dialog,...) fonction et instance sont séparés.


    Citation Envoyé par StabiloHB Voir le message
    Par contre une ligne que je ne comprend pas du tout :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    super().__init__(master)
    Normal, vous n'avez pas pris le temps de potasser un tuto. héritage, surcharge,... sont des notions qui y sont expliquées en long, en large et en travers.

    Citation Envoyé par StabiloHB Voir le message
    J'ai "continué" le programme en rajoutant une liste pour collecter les résultats, est ce qu'il est toujours bien dans l'esprit des class ?
    A ces gens pressés qui veulent des résultats. La fonctionnalité qui manque est la gestion de la sortie des différents dialogues. La vous avez une interaction à créer. Est ce qu'on crée une liste de résultat "à la fin" ou "au fil de l'eau"? Comment signale-t-on qu'une série de question est terminée?
    A vous de voir.

    Citation Envoyé par StabiloHB Voir le message
    Effectivement quand on voit le resultat, il n'est pas si compliqué. Je dois surement manquer de patiente certe, mais je n'ai surement pas non plus la rigueur de quelqu'un qui sait programmer en OOP.
    Bah... vous n'avez pas besoin de class pour faire çà. Les "class" proposent juste un canevas pour organiser le code. Mais elles ne sont pas indispensables.


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

  9. #9
    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
    La fonctionnalité qui manque est la gestion de la sortie des différents dialogues.
    Je vais interpreter ces listes de '1' et de '2' pour print des résultats, ils seront indépendant à chaque question. J'essayerai de faire une class sur le même principe que précédement avec un abre si oui print ça si non print ceci.

    Merci pour votre temps,

    Valentin.

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

Discussions similaires

  1. [Batch] Exécuter des commandes sur plusieurs serveurs en même temps
    Par Med_be dans le forum Scripts/Batch
    Réponses: 7
    Dernier message: 27/03/2015, 19h05
  2. [WD19] Exécuter plusieurs procédures en même temps
    Par lololebricoleur dans le forum WinDev
    Réponses: 2
    Dernier message: 30/01/2014, 11h39
  3. exécuter plusieurs scripts en même temps
    Par TgZ-le_joker_fou dans le forum Langage
    Réponses: 5
    Dernier message: 24/12/2011, 10h33
  4. Exécuter plusieurs fonctions en même temps
    Par vash641 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 13/05/2009, 15h50
  5. Exécuter plusieurs requêtes en même temps
    Par k_boy dans le forum Bases de données
    Réponses: 9
    Dernier message: 21/02/2008, 12h51

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