Warning: Undefined array key "DOKU_PREFS" in /home/clients/a4e6fc1ce1761b72982b805de0f418c4/web/python/mesrecettespython/inc/common.php on line 2082
barre_de_menu [Les recettes Python de Tyrtamos]

Outils pour utilisateurs

Outils du site


barre_de_menu

Warning: Undefined array key -1 in /home/clients/a4e6fc1ce1761b72982b805de0f418c4/web/python/mesrecettespython/inc/html.php on line 1458

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
barre_de_menu [2008/04/27 07:24]
tyrtamos
barre_de_menu [2008/07/08 07:40]
tyrtamos
Ligne 432: Ligne 432:
 fen.mainloop() fen.mainloop()
 </code> </code>
 +
 +===== Faire en sorte que les codes clavier soient calés à droite =====
 +
 +On veut qu'un menu se présente un peu comme cela (exemple des items d'un menu de type "Fichier"):
 +
 +  Ouvrir        Ctrl+O
 +  Fermer        Ctrl+W
 +  Enregistrer   Ctrl+S
 +  Quitter       Alt+X
 +
 +C'est à dire que les raccourcis commandes claviers sont alignés.
 +
 +Le problème, c'est que dans une police de caractères type "arial", les caractères n'ont pas tous la même largeur en pixels à l'écran.
 +
 +==== Solution "normale" avec l'option "accelerator" ====
 +
 +J'ai mis pas mal de temps à trouver cette option qui ne se trouve pas dans tous les manuels.
 +
 +Au lieu de faire par exemple:
 +
 +<code python>
 +self.edition.add_command(label="Copier   Ctrl-C", underline=2, command = self.copier)
 +</code>
 +
 +On fait:
 +
 +<code python>
 +self.edition.add_command(label="Copier", accelerator="Ctrl-C", underline=2, command = self.copier)
 +</code>
 +
 +Et les différents codes de commande clavier d'un même menu et cités par accelerator, seront alignés
 +
 +==== Solution avec "measure" ====
 +
 +Je cite cette solution pour mémoire et parce que c'est un exemple d'utilisation de la méthode "measure" qui peut servir à d'autres choses.
 +
 +On va utiliser une des fonctions du module tkFont: "measure(texte)", qui mesure en pixel la longueur d'un texte. Et on ajustera à la fin avec des espaces.
 +
 +L'alignement n'est pas parfait: on peut faire une erreur maxi égale au nombre de pixels d'un espace - 1. Mais c'est tout de même très bien!
 +
 +l'alignement choisi ici est de caler les codes clavier à droite. Mais on pourrait aussi les aligner sur leur 1er caractère en modifiant le code.
 +
 +La fonction qui ajuste l'item s'appelle ici: ajusteitems().
 +
 +Voilà le code (il est auto-documenté):
 +
 +<code python>
 +#!/usr/bin/python
 +# -*- coding: utf-8 -*-
 + 
 +import Tkinter, tkFont
 + 
 +class Application(Tkinter.Frame):
 + 
 +    def __init__(self, master=None):
 +        Tkinter.Frame.__init__(self, master, background="grey")
 + 
 +        self.policemenu=tkFont.Font(self, size=9, family='Arial')
 + 
 +        # creation de la barre de menu:
 +        self.barremenu = Tkinter.Menu(self.master)
 +
 +        # représentation des items du menu "Fichier" sous forme de liste:
 +        self.itemmenu=[
 +                  ["Ouvrir", "Ctrl+O"],
 +                  ["Fermer", "Ctrl+W"],
 +                  ["Enregistrer", "Ctrl+S"],
 +                  ["Quitter", "Alt+X"]
 +                      ]
 +        items=self.ajusteitems(self.itemmenu)
 +        
 +        # creation du menu "Fichier"
 +        self.fichier = Tkinter.Menu(self.barremenu, tearoff=0, font=self.policemenu)
 +        self.barremenu.add_cascade(label="Fichier",menu=self.fichier)
 +        self.fichier.add_command(label=items[0], command=self.ouvrir)
 +        self.fichier.add_command(label=items[1], command=self.fermer)
 +        self.fichier.add_command(label=items[2], command=self.enregistrer)
 +        self.fichier.add_separator()
 +        self.fichier.add_command(label=items[3], command=self.quitter)
 + 
 +        # représentation des items du menu "Aide" sous forme de liste:
 +        self.itemmenu=[
 +                  ["Manuel", "F1"],
 +                  ["A propos", ""]
 +                      ]
 +        items=self.ajusteitems(self.itemmenu)
 +        
 +          # creation du menu "Aide"
 +        self.aide = Tkinter.Menu(self.barremenu, tearoff=0, font=self.policemenu)
 +        self.barremenu.add_cascade(label="Aide",menu=self.aide)
 +        self.aide.add_command(label=items[0], command = self.manuel)
 +        self.aide.add_command(label=items[1], command = self.apropos)
 + 
 +        # afficher le menu
 +        self.master.config(menu=self.barremenu)
 + 
 +    def ajusteitems(self, itemmenu):
 +        # Calcul de la longueur maxi en pixels des items du menu fichier:
 +        lg=0
 +        for i1, i2 in itemmenu:
 +            lg1=self.policemenu.measure(i1)
 +            lg2=self.policemenu.measure(i2)
 +            if lg1+lg2>lg:
 +                lg=lg1+lg2
 +        esp=self.policemenu.measure(" " # = nb de pixels d'un espace
 +        lg=lg+2*esp  # ajout de 2 espaces
 +
 +        # Ajustement des espaces pour que les commandes clavier soient calées à droite
 +        lch=[]
 +        for i1, i2 in self.itemmenu:
 +            lg1=self.policemenu.measure(i1)
 +            lg2=self.policemenu.measure(i2)
 +            n=(lg-lg1-lg2)/esp
 +            lch.append(i1 + " "*n + i2)
 +        return lch
 +
 +    def ouvrir(self): print "Ouvrir"
 +    def fermer(self): print "fermer"
 +    def enregistrer(self): print "enregistrer"
 +    def quitter(self): self.master.destroy()
 +    def manuel(self): print "manuel"
 +    def apropos(self): print "apropos"
 + 
 +#############################################################################
 +fen=Tkinter.Tk()
 +fen.title("Ma fenêtre")
 +app=Application(fen)
 +fen.geometry("%dx%d%+d%+d" % (300,300,100,100))
 +fen.mainloop()
 +</code>
 +
 +
 +
 +
  
 <html> <html>
barre_de_menu.txt · Dernière modification: 2008/07/08 07:40 de tyrtamos