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 :
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 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...
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 :
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)
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().
Code : Sélectionner tout - Visualiser dans une fenêtre à part while 1:
Merci d'avance,
Valentin.
Partager