Bonsoir à tous, je continue à grand peine mon apprentissage de Tkinter à l'aide de classes. J'ai trouvé sur le site de l'université de paris Diderot ce programme qui me déconcerte. Je précise que j'utilise winPython avec l'IDE spyder.
Question 1Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 import tkinter as tk class Application(tk.Frame): def __init__(self, racine=None): tk.Frame.__init__(self) self.racine = racine self.create_widgets() def create_widgets(self): self.label = tk.Label(self.racine, text="J'adore Python !") self.bouton = tk.Button(self.racine, text="Quitter", command=self.destroy) self.label.pack() self.bouton.pack() app = Application() app.mainloop()
Pourquoi cliquer sur le bouton ne donne rien (la fenêtre ne se ferme pas) ?
Question 2
L'auteur explique que la ligne tk.Frame(self) instancie automatiquement une fenêtre Tk. Ça, je veux bien le croire. Mais il ajoute que l'instance de la fenêtre principale est alors self.racine. C'est sûrement basique, mais je ne comprends pas du tout pourquoi. Ce n'est pas le paramètre self qui contient cette référence ?
Questions 3
Quel-est le nom du widget Frame ? Est-ce qu'il est exact de penser que ce Frame a l'instance app pour parent et que Label et Button sont censés être les enfants de Frame ?
Question 4
Cet attribut self.racine, quel est son intérêt (à supposer qu'il serve à quelque chose) ? Est-ce que l'attribut self.master ne suffit pas ? J'ai modifié le programme de cette façon. Est-ce que malgré les apparences j'ai fait quelque chose de très différent ?
Question 5Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 import tkinter as tk class Application(tk.Frame): def __init__(self): tk.Frame.__init__(self) self.create_widgets() def create_widgets(self): self.label = tk.Label(self.master, text="J'adore Python !") self.bouton = tk.Button(self.master, text="Quitter", command=self.master.destroy) self.label.pack() self.bouton.pack() app = Application() app.mainloop()
Pour finir, si je condense les deux dernières lignes en
Comment connaître la référence de la fenêtre principale ?Code:Application().mainloop()
Voilà, j'ai conscience d'avoir été long, et pas forcément très clair. J'ai du chemin à faire hein ? Mais je remercie d'avance les bonnes âmes patientes qui se pencheront sur mes questions.