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
| # Code d'essai proposé par wiztricks pour comprendre la methode ".index()" (et l'activation / désactivation d'un menu)
# Commenté par Yobeco pour s'aider à comprendre les notions utilisées
# Ajout également de sous-menus (entrées) pour étudier les index de ces sous-menus
from tkinter import *
labels = list('ABCD') # Création d'une liste à partir d'une "String" pour créer des boutons par la suite
root=Tk()
root.geometry("400x100") # Fixer une taille à la fenêtre pour que tous les menus créés puissent loger.
#########################################################
# Création des fonctions activées par les menus #
#########################################################
# Fonction pour réactiver les menus 'ABCD'
def do_reset():
for i in range(len(labels)): # range(len(labels)) crée une liste composée d'une suite de "int" de la taille de la liste "labels" --> http://www.imarend.com/tutorials/PythonBase/python10FR.html
menu.entryconfig(i+1,state=NORMAL) # Pour chaque menu d'index correspondant à ces valeurs, imposer l'état NORMAL (cliquable)
# "i+1" On commence à 1 parce que le premier menu (à gauche) est indexé à 1 par défaut
# Fonction pour afficher l'index des menus 'ABCD'
def do_showindex():
for s in labels: # Pour troutes les valeurs des cellules de la liste "labels" (labels de menus donc)
print("L'index de", s, "est", menu.index(s)) # Afficher le label du menu et l'index correspondant
##############################
# Création des menus #
##############################
menu = Menu(root) # Création du menu dans la fenêtre root
# Créations de menus 'ABCD' directement actifs dans la barre de menu (façon boutons)
# Documentation sur "enumerate()" --> https://docs.python.org/fr/3/library/functions.html#enumerate
for i, label in enumerate(labels, start=1): # Pour chaque élément de la liste "labels" en obligeant le premier éléménent à avoir l'index 1 --> "start=1"
# (parce que le premier élément du menu (à gauche) a, par définition, l'index 1)
menu.add_command(label=label, # --> créer un menu ayant l'élément de la liste "labels" comme texte
# et une fonction qui permet de désactiver le menu quand il est cliqué
command=lambda i=i: menu.entryconfig(i,state=DISABLED)) # Dans "lambda" : "i=i" oblige "i" de "lambda" à être le même que le "i" de la boucle "for"
# Ainsi, la fonction de chaque bouton est de se désactiver
# Affichage des autres boutons
menu.add_command(label="Show index", command=do_showindex)
menu.add_command(label="Reset", command=do_reset)
menu.add_command(label="Exit", command=root.quit)
# Création d'un menu dépliable pour étudier les index des entrées (sous-menus)
menu_depl = Menu(menu, tearoff=0) # tearoff=0 interdit au menu dépliable d'être décroché de la fenêtre
# --> 1er code (naïf) : il correspond explicitement à l'idée que je voulais mettre en place :
# menu_depl.add_command(label="Entrée 0", command=lambda: print('L\'index de "Entrée 0" est :', menu_depl.index("Entrée 0")))
# menu_depl.add_command(label="Entrée 1", command=lambda: print('L\'index de "Entrée 1" est :', menu_depl.index("Entrée 1")))
# menu_depl.add_command(label="Entrée 2", command=lambda: print('L\'index de "Entrée 2" est :', menu_depl.index("Entrée 2")))
# menu_depl.add_command(label="Entrée 3" ...
# --> 2ème code plus efficace pour produire le même résultat :
for i in range(7):
label_i = "Entrée " + str(i+1) # Préparer un label pour chaque sous-menu en utilisant "i"
menu_depl.add_command(label=label_i, # Création des sous-menus
command=lambda label_i=label_i: print('L\'index de', label_i, 'est :', menu_depl.index(label_i)))
# Dans "lambda", "label_i=label_i" permet à la variable "label_i" d'être la même que dans la boucle "for"
# Ainsi, à chaque appel de "lambda", chaque entrée renvoie bien son index
# Dans "menu_depl.index(label_i)" : c'est parce quon applique la méthode .index() à "menu_depl" qu'on obtient les index des entrées du menu dépliant
menu.add_cascade(label="Menu dépliable", menu=menu_depl) # Afficher le menu en cascade
# Afficher les index de chaque menu
print('L\'index de "Show index" est :', menu.index("Show index"))
print('L\'index de "Reset" est :', menu.index("Reset"))
print('L\'index de "Exit" est :', menu.index("Exit"))
print('L\'index de "Menu dépliable" est :', menu.index("Menu dépliable"))
root.config(menu=menu)
root.mainloop() |
Partager