⇨ MENU ⇨ MODULES ⇨ tkinter ⇨ controles standards ⇨ Menu
Tutoriel de tkinter.Menu ( )
⇨ MENU ⇨ MODULES ⇨ tkinter ⇨ controles standards ⇨ Menu
Tutoriel de tkinter.Menu ( )
DESCRIPTION.
Créer un nouveau controle de type menu surgissant, ou menu déroulant, ou pop-up (widget : tkinter.Menu ( )).
SYNTAXE.
MNU_Choix = tkinter.Menu ( MNU_Conteneur , attribut1 = valeur , ... , attributn = valeur )
MNU_Choix = ⇨ affectation de l'instance du controle [ optionnel ]
tkinter.Menu ( ) ⇨ création d'une instance de tkinter.Menu ( ) [ OBLIGATOIRE ]
MNU_Conteneur ⇨ instance de tkinter.Menubutton ( ) contenant le menu déroulant [ OBLIGATOIRE ]
attribut = valeur ⇨ attribut à modifier avec sa nouvelle valeur [ optionnel ]
REMARQUES.
Les menus déroulant, ou menu surgissant, ne peuvent être utilisés seuls. Ils doivent être placés dans un conteneur de type tkinter.Menubutton ( ), sauf, exceptionnellement, pour créer la barre de menus d'une fenêtre.
Les controles créés avec le constructeur de classe tkinter.Menubutton ( ), sont les conteneurs de menus, ils représentent la partie, le titre, du menu qui reste présente, dans l'interface et qui attend que l'utilisateur clique sur lui.
Alors que les controles générés par le constructeur de classe tkinter.Menu ( ), sont les menus déroulants, ils représentent la partie, la liste, déroulante, qui restera cachée tant que l'utilisateur n'aura pas cliqué sur l'étiquette l'onglet, du conteneur de menu qui le contient.
Les objets permanents de type tkinter.Menu ( ) sont identifiés dans le site par : MNU_.
Voir les conventions sur les variables utilisées dans ce site ...
CREATION D'UN MENU DEROULANT BASIC.
Si le menu ne comporte qu'un seul menu déroulant, ou si l'on ne souhaite pas regrouper plusieurs menus déroulants ensemble, il n'est pas nécessaire d'intégrer le conteneur de menu dans un conteneur parent de type tkinter.Frame ( ). Cela permet de placer les menus déroulants proche des controles sur les quels ils vont agir plus particulièrement, pour monter à l'utilisateur leur affinité.
import tkinter
def FNC_Couleur ( Q ) :
LAB_Temoin [ "background" ] = Q
def FNC_Texte ( ) :
LAB_Temoin [ "text" ] = "Etiquette\ntest" if "LABEL" in LAB_Temoin [ "text" ] else "LABEL\nTEMOIN"
TKI_Principal = tkinter.Tk ( )
LAB_Temoin = tkinter.Label ( TKI_Principal , text = "LABEL\nTEMOIN" , relief = "solid" )
MNU_Entete = tkinter.Menubutton ( TKI_Principal , text = "Couleur" ) # 01
MNU_Options = tkinter.Menu ( MNU_Entete ) # 02
MNU_Options.add_command ( label = "Texte" , command = FNC_Texte ) # 03
MNU_Options.add_separator ( ) # 04
MNU_Options.add_command ( label = "Blanc" , command = lambda : FNC_Couleur ( "white" ) ) # 05
MNU_Options.add_command ( label = "Vert" , command = lambda : FNC_Couleur ( "green" ) ) # 05
MNU_Options.add_command ( label = "Jaune" , command = lambda : FNC_Couleur ( "yellow" ) ) # 05
MNU_Options.add_command ( label = "Rouge" , command = lambda : FNC_Couleur ( "red" ) ) # 05
MNU_Options.add_separator ( ) # 04
MNU_Options.add_command ( label = "Quitter" , command = TKI_Principal.destroy ) # 06
MNU_Entete [ "menu" ] = MNU_Options # 07
MNU_Entete.pack ( side = "left" , padx = 10 ) # 08
LAB_Temoin.pack ( side = "right" , padx = 10 )
TKI_Principal.mainloop ( )
# 01 : création d'un controle de type tkinter.Menubutton ( ), c'est le conteneur des menus déroulants.
# 02 : création d'un controle de type tkinter.Menu ( ), c'est le menu déroulant qui présentera les options.
# 03 : création d'une option qui appelle directement la fonction qui lui est associée.
# 04 : création d'une ligne de séparation, pour une présentation des options par famille d'action.
# 05 : création d'une option devra passer un argument spécifique à la fonction qui lui est associée.
# 06 : création d'une option devra qui appelle une méthode générale.
# 07 : mise en place du menu déroulant, avec ses options, dans son conteneur de menus.
# 08 : mise en place du conteneur de menu dans son parent.
L'étape # 07 peut aussi être placée entre les étapes # 02 et # 03.
De même que les étapes # 03, # 04, # 05 et # 06 pourront être écrites après l'étape # 07 et/ou # 08.
CREATION D'UN GROUPE DE MENUS DEROULANTS.
Si le menu comporte plusieurs menus déroulants, il est nécessaire d'intégrer les conteneurs de menu dans un conteneur parent de type tkinter.Frame ( ). Cela permettra de placer des menus spécifiques à chaque région, cadre, de la fenêtre où ils doivent agir plus précisément.
import tkinter
def FNC_Couleur ( Q ) :
LAB_Temoin [ "background" ] = Q
def FNC_Texte ( Q ) :
LAB_Temoin [ "text" ] = Q
TKI_Principal = tkinter.Tk ( )
LAB_Temoin = tkinter.Label ( TKI_Principal , text = "Bonjour" , relief = "solid" )
FRM_Menus = tkinter.Frame ( TKI_Principal ) # 01
MNU_Texte = tkinter.Menubutton ( FRM_Menus , text = "Langue" ) # 02 a
MNU_Textes = tkinter.Menu ( MNU_Texte ) # 03 a
MNU_Textes.add_command ( label = "Francais" , command = lambda : FNC_Texte ( "Bonjour" ) ) # 04 a
MNU_Textes.add_command ( label = "Anglais" , command = lambda : FNC_Texte ( "Hello" ) ) # 04 a
MNU_Textes.add_command ( label = "Espagnol" , command = lambda : FNC_Texte ( "Buenos dias" ) ) # 04 a
MNU_Texte [ "menu" ] = MNU_Textes # 05 a
MNU_Couleur = tkinter.Menubutton ( FRM_Menus , text = "Couleur" ) # 02 b
MNU_Couleurs = tkinter.Menu ( MNU_Couleur ) # 03 b
MNU_Couleurs.add_command ( label = "Blanc" , command = lambda : FNC_Couleur ( "white" ) ) # 04 b
MNU_Couleurs.add_command ( label = "Vert" , command = lambda : FNC_Couleur ( "green" ) ) # 04 b
MNU_Couleurs.add_command ( label = "Jaune" , command = lambda : FNC_Couleur ( "yellow" ) ) # 04 b
MNU_Couleurs.add_command ( label = "Rouge" , command = lambda : FNC_Couleur ( "red" ) ) # 04 b
MNU_Couleur [ "menu" ] = MNU_Couleurs # 05 b
MNU_Sortir = tkinter.Menubutton ( FRM_Menus , text = "Quitter" ) # 02 c
MNU_Quitter = tkinter.Menu ( MNU_Sortir ) # 03 c
MNU_Quitter.add_command ( label = "Quitter" , command = TKI_Principal.destroy ) # 04 c
MNU_Sortir [ "menu" ] = MNU_Quitter # 05 c
MNU_Texte.grid ( row = 0 , column = 0 ) # 06 a
MNU_Couleur.grid ( row = 0 , column = 1 ) # 06 b
MNU_Sortir.grid ( row = 0 , column = 2 ) # 06 c
FRM_Menus.pack ( ) # 07
LAB_Temoin.pack ( )
TKI_Principal.mainloop ( )
# 01 : création d'un controle de type tkinter.Frame ( ), c'est la barre de menus déroulants.
# 02 : création d'un controle de type tkinter.Menubutton ( ), c'est le conteneur d'un menu déroulants.
# 03 : création d'un controle de type tkinter.Menu ( ), c'est le menu déroulant qui présentera les options.
# 04 : création d'une option.
# 05 : mise en place du menu déroulant, avec ses options, dans son conteneur de menus.
# 06 : mise en place du conteneur de menu dans sa barre de menus.
# 07 : mise en place de la barre de menus dans son parent.
Dans l'exemple ci-dessus, les menus déroulants sont placés en haut du cadre, les uns après les autres, de façon traditionnelle. Mais il est tout à fait possible de les présenter les uns sous les autres ; ailleurs dans le cadre ou même détachés les uns des autres, n'importe où dans le parent comme tous ses autres enfants, controles, si le cadre en contient.
CREATION D'UNE BARRE DE MENUS DANS UNE FENETRE.
tkinter offre la possibilité de créer une barre de menu standard, ancrée en haut et à gauche, de chaque fenêtre de l'interface, sans créer de conteneur parent avec la classe tkinter.Frame ( ), ni conteneur de menu avec la classe tkinter.Menubutton ( ).
Cependant cette possibilité, utilisant l'attribut menu des fenêtres de tkinter et la méthode tkinter.Menu ( ).add_cascade ( ), ne permettra pas de présenter des options de type tkinter.Menu ( ).checkbutton ( ) et tkinter.Menu ( ).radiobutton ( ), qui seront ignorées mais sans lever d'exception.
import tkinter
def FNC_Couleur ( Q ) :
LAB_Temoin [ "background" ] = Q
def FNC_Texte ( Q ) :
LAB_Temoin [ "text" ] = Q
TKI_Principal = tkinter.Tk ( )
TKI_Principal.geometry ( "250x75+100+50" )
LAB_Temoin = tkinter.Label ( TKI_Principal , text = "Bonjour" , relief = "solid" )
MNU_Menu = tkinter.Menu ( TKI_Principal ) # 01
MNU_Textes = tkinter.Menu ( MNU_Menu ) # 02 a
MNU_Textes.add_command ( label = "Francais" , command = lambda : FNC_Texte ( "Bonjour" ) ) # 03 a
MNU_Textes.add_command ( label = "Anglais" , command = lambda : FNC_Texte ( "Hello" ) ) # 03 a
MNU_Textes.add_command ( label = "Espagnol" , command = lambda : FNC_Texte ( "Buenos dias" ) ) # 03 a
MNU_Couleurs = tkinter.Menu ( MNU_Menu ) # 02 b
MNU_Couleurs.add_command ( label = "Blanc" , command = lambda : FNC_Couleur ( "white" ) ) # 03 b
MNU_Couleurs.add_command ( label = "Vert" , command = lambda : FNC_Couleur ( "green" ) ) # 03 b
MNU_Couleurs.add_command ( label = "Jaune" , command = lambda : FNC_Couleur ( "yellow" ) ) # 03 b
MNU_Couleurs.add_command ( label = "Rouge" , command = lambda : FNC_Couleur ( "red" ) ) # 03 b
MNU_Quitter = tkinter.Menu ( MNU_Menu ) # 02 c
MNU_Quitter.add_command ( label = "Quitter" , command = TKI_Principal.destroy ) # 03 c
MNU_Menu.add_cascade ( label = "Langue" , menu = MNU_Textes ) # 04 c
MNU_Menu.add_cascade ( label = "Couleur" , menu = MNU_Couleurs ) # 04 c
MNU_Menu.add_cascade ( label = "Sortir" , menu = MNU_Quitter ) # 04 c
TKI_Principal [ "menu" ] = MNU_Menu # 05
LAB_Temoin.pack ( )
TKI_Principal.mainloop ( )
# 01 : création d'un controle tkinter.Menu ( ), c'est le menu déroulant intégré directement dans la fenêtre.
# 02 : création d'un controle tkinter.Menu ( ), intégré dans le menu déroulant principal.
# 03 : création d'une option d'un sous-menu déroulant.
# 04 : mise en place des sous-menus déroulants, dans le menu déroulant principal.
# 05 : mise en place du menu déroulant principal, dans la fenêtre.
Si la fenêtre est trop étroite, en largueur, pour pouvoir contenir tous les onglets de la barre de menu les uns après les autres, la barre de menu pourra être présenté sur plusieurs lignes.
Votre aide est précieuse pour améliorer ce site, alors n'hésitez pas à faire part de