Tkinter, la boîte à outils GUI intégrée de Python, simplifie la création d’applications de bureau interactives. Une tâche courante consiste à ouvrir de nouvelles fenêtres en réponse aux actions de l’utilisateur, comme les clics sur les boutons. Cet article détaille comment créer et gérer efficacement ces nouvelles fenêtres, en couvrant divers scénarios et les meilleures pratiques.
Table des matières
- Création de la fenêtre principale et du bouton
- Personnalisation des nouvelles fenêtres
- Gestion de plusieurs fenêtres
- Techniques avancées : Modalité et transfert de données
- Conclusion
Création de la fenêtre principale et du bouton
Commençons par importer Tkinter et créer une fenêtre principale basique avec un bouton qui déclenche la création d’une nouvelle fenêtre :
import tkinter as tk
def create_new_window():
new_window = tk.Toplevel(root)
new_window.title("Nouvelle fenêtre")
new_window.geometry("300x200")
root = tk.Tk()
root.title("Application principale")
button = tk.Button(root, text="Ouvrir une nouvelle fenêtre", command=create_new_window)
button.pack(pady=20)
root.mainloop()
Ce code définit une fonction create_new_window
qui utilise tk.Toplevel(root)
pour créer une nouvelle fenêtre de niveau supérieur. L’argument root
assure que la nouvelle fenêtre est associée à l’application principale. geometry
définit ses dimensions. L’attribut command
du bouton le lie à cette fonction. root.mainloop()
lance la boucle d’événements Tkinter.
Personnalisation des nouvelles fenêtres
La nouvelle fenêtre, étant une fenêtre Tkinter standard, peut être personnalisée de manière extensive. Ajoutez des étiquettes, des champs de saisie, ou tout autre widget pour créer l’interface souhaitée :
import tkinter as tk
def create_new_window():
new_window = tk.Toplevel(root)
new_window.title("Nouvelle fenêtre")
new_window.geometry("300x200")
label = tk.Label(new_window, text="Ceci est une fenêtre personnalisée !")
label.pack(pady=20)
entry = tk.Entry(new_window)
entry.pack(pady=10)
# ... (reste du code de l'exemple précédent)
Cet exemple amélioré ajoute une étiquette et un champ de saisie. Pour des mises en page plus sophistiquées, envisagez d’utiliser .grid()
ou .place()
au lieu de .pack()
pour un meilleur contrôle du placement des widgets.
Gestion de plusieurs fenêtres
Lorsqu’on gère de nombreuses fenêtres, il devient crucial de les suivre. Une simple liste peut stocker les références à chaque fenêtre :
import tkinter as tk
windows = []
def create_new_window():
new_window = tk.Toplevel(root)
new_window.title(f"Nouvelle fenêtre {len(windows) + 1}")
new_window.geometry("300x200")
windows.append(new_window)
new_window.protocol("WM_DELETE_WINDOW", lambda: close_window(new_window))
def close_window(window):
windows.remove(window)
window.destroy()
# ... (reste du code)
La liste windows
stocke chaque nouvelle fenêtre. Le titre affiche maintenant le numéro de la fenêtre. La fonction close_window
supprime la fenêtre de la liste et la détruit en toute sécurité. La méthode protocol
assure un nettoyage approprié lors de la fermeture de la fenêtre.
Techniques avancées : Modalité et transfert de données
Modalité : Pour créer des boîtes de dialogue modales (fenêtres qui bloquent l’interaction avec l’application principale jusqu’à leur fermeture), utilisez tk.Toplevel
avec l’option transient
définie sur root
et envisagez d’utiliser grab_set()
sur la boîte de dialogue pour vous assurer qu’elle est la seule fenêtre pouvant recevoir le focus.
Transfert de données : L’échange de données entre les fenêtres peut se faire par différentes méthodes :
- Variables globales : Simple, mais peut entraîner des problèmes dans les applications plus importantes.
- Arguments de fonction : Passer les données directement à la fonction de création de la nouvelle fenêtre.
- Variables Tkinter : Utilisez
StringVar
,IntVar
, etc., pour une liaison et des mises à jour de données efficaces.
Conclusion
Créer et gérer de nouvelles fenêtres dans Tkinter est gérable avec tk.Toplevel
. Des techniques efficaces pour gérer plusieurs fenêtres et transférer des données améliorent l’organisation et la maintenabilité de l’application. N’oubliez pas d’utiliser des gestionnaires de disposition appropriés (.grid()
, .place()
) et d’envisager d’utiliser des boîtes de dialogue modales pour des interactions spécifiques. Expérimentez et adaptez votre approche aux besoins de votre application.