Comme le bug précédent est résolu , je poursuis mon application qui consiste à afficher une boîte de dialogue quand on clique sur un menu.
Mon problème : la boîte de dialogue s'affiche avant que le menu n'apparaisse . Puis ne s'affiche plus quand je clique sur le menu "New Task" .

voir ligne 12 quand je crée le menu puis lignes 16 et 17 que j'ai commentées.

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
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
91
92
93
94
95
96
97
98
99
100
import tkinter as tk
 
class View:
    def __init__(self, master):
        master.title("Dialog Box") # et non master.title = "Dialog Box" !!!
 
        #Menu
        self.mainMenu = tk.Menu(master, tearoff=False)
 
        #MenuTasks
        self.menuTasks = tk.Menu(self.mainMenu, tearoff=False)
        self.menuTasks.add_command(label='New Task', command=self.newTask(master))
        self.mainMenu.add_cascade(label="Tasks", menu=self.menuTasks)
        master.config(menu=self.mainMenu)
 
    def newTask(self, master):
        nt = dialogBoxNewTask(master, "New Task", offx=-50, offy=-100) # cette ligne semble s'exécuter quand on crée une instance de la classe View !?
            #Ensuite quand on clique sur le menu 'New task', la boîte de dialogue ne s'affiche plus...
 
 
class DialogBox(tk.Toplevel):
    def __init__(self, container, title=None, offx=250, offy=250):
        tk.Toplevel.__init__(self, container)
        self.protocol("WM_DELETE_WINDOW", self.cancel)
        self.transient(container)
 
        self.title("New Task")
 
        self.container = container
        self.result = None
 
        frame = tk.Frame(self)
        self.initial_focus = self.packing(frame)
        frame.pack(padx=10, pady=10)
 
        focusDefault = self.buttons()
 
        self.grab_set()
 
        if not self.initial_focus:
            self.initial_focus = focusDefault
 
        self.initial_focus.focus_set()
 
        self.wait_window(self)
 
    def packing(self, master):
        pass  # to be overloaded
 
    def buttons(self):
        buttonOK = tk.Button(self, text="OK", command=self.ok, default=tk.ACTIVE)
        buttonCancel = tk.Button(self, text="Cancel", command=self.cancel)
        buttonOK.pack(side=tk.LEFT, padx=5, pady=5)
        buttonCancel.pack(side=tk.LEFT, padx=5, pady=5)
 
        return buttonOK  # Pourquoi ??
 
    def ok(self, event=None):
        self.initial_focus.focus_set()
        self.withdraw()
        self.update_idletasks()
        self.apply()
        self.cancel()
 
    def cancel(self, event=None):
        self.container.focus_set()
        self.destroy()
 
    def apply(self):
        pass  # to be overloaded
 
 
class dialogBoxNewTask(DialogBox):
    #je ne comprends pas pourquoi le tuto ne propose pas de constructeur :
    #def __init__(self, container, title=None, offx=250, offy=250):
        #DialogBox.__init__(self, container, title, offx, offy)
 
    def packing(self, master):
        tk.Label(master, text="Task :").grid (row=0, column=0)
        self.taskTask = tk.Entry(master)
        self.taskTask.grid(row=0, column=1)
        tk.Label(master, text="Due Date :").grid (row=0, column=2)
        self.taskDueDate = tk.Entry(master)
        self.taskDueDate.grid(row=0, column=3)
        return self.taskTask                             #Why ??
 
    def apply(self):
        self.result = "Result"
 
class Controller:
    def __init__(self):
        self.root = tk.Tk()
        #self.model = Model()
        self.view = View(self.root)
 
    def run(self):
        self.root.mainloop()
 
main = Controller()
main.run()
Merci d'avance...