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.