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

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
Dernière révision Les deux révisions suivantes
barre_de_menu [2008/04/20 08:05]
tyrtamos
barre_de_menu [2008/07/05 17:20]
tyrtamos
Ligne 433: Ligne 433:
 </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 calés automatiquement à droite.
 +
 +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.
 +
 +Alors, 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.
 +
 +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>
 +<head>
 +<style type="text/css">
 +<!--
 +body {background-image:url(fondcorps.jpg);}
 +-->
 +</style>
 +</head>
 +<body>
 +</body>
 +</html>
  
barre_de_menu.txt · Dernière modification: 2008/07/08 07:40 de tyrtamos