IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tkinter Python Discussion :

Menu Tkinter avec lien dans label d'un sous-menu


Sujet :

Tkinter Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 12
    Points : 10
    Points
    10
    Par défaut Menu Tkinter avec lien dans label d'un sous-menu
    Bonjour,
    J'aurais souhaité créer un menu Tkinter pour mon programme mais quand je désire mettre un lien dans le label d'un item d'un sous-menu, ceux-ci ne sont pas aligné.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    fichier.add_cascade(label='Ouvrir         Ctrl+o', command=open)
    fichier.add_cascade(label='Enregistrer Ctrl+s', command=save)
    Dans l'IDLE, le menu s'affiche correctement, mais comment ?
    J'arrive à trouver la solution en changeant de police de caractères.
    Merci de votre réponse.

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 484
    Points : 9 286
    Points
    9 286
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    J'ai regardé dans le manuel de tkinter, et je n'ai rien vu de facile pour faire cela.

    Alors, j'ai regardé dans les sources d'IDLE. les textes d'item sont construites par calcul pour que les codes claviers soient alignés. Mais la solution adoptée est trop compliquée (pour moi en tout cas).

    Je te propose donc une solution qui, bien que n'étant pas parfaite, donne des résultats intéressants. Elle est basée sur le fait que la fonction measure(texte) mesure la longueur en pixel du texte dans la police de caractère donnée.

    L'imperfection vient du fait que je ne fais la correction finale qu'avec des espaces et non au pixel près (si quelqu'un sait faire au pixel près?).

    Voilà un code qui fait ça: recopie-le dans idle et exécute-le pour voir si ça te convient. La fonction qui fait l'ajustement s'appelle ajusteitems():

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
    #!/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()
    Si tu veux d'autres infos sur les menus tkinter, j'ai mis ici ce que je savais:
    http://python.jpvweb.com/mesrecettes.../barre_de_menu

    Tyrtamos

  3. #3
    Membre averti
    Homme Profil pro
    Responsable du parc et des réseaux de télécommunication
    Inscrit en
    Mai 2003
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable du parc et des réseaux de télécommunication
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2003
    Messages : 290
    Points : 388
    Points
    388
    Par défaut
    Bonjour,
    Essaie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fichier.add_cascade(label='Ouvrir',accelerator='Ctrl+o', command=open)
    fichier.add_cascade(label='Enregistrer',accelerator='Ctrl+s', command=save)

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 484
    Points : 9 286
    Points
    9 286
    Billets dans le blog
    6
    Par défaut
    Bravo pierjean!

    J'ai cherché un moment une commande de ce genre, qui ne se trouve pas dans le manuel de Mexico...

    J'ai vérifié qu' "accelerator=" fonctionne sous Windows et Linux.

    J'adopte!

    Tyrtamos

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    Un grand merci pour vos réponses, cela m'a vraiment aidé !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. ouvrir navigateur avec lien dans jtextarea
    Par lostsoul dans le forum Composants
    Réponses: 3
    Dernier message: 15/07/2011, 07h04
  2. Menu déroulant avec liens hypertextes?
    Par soufiane2102 dans le forum Dreamweaver
    Réponses: 1
    Dernier message: 02/03/2009, 14h45
  3. Réponses: 1
    Dernier message: 26/09/2008, 17h38
  4. Liste deroulante avec lien dans une jsp
    Par fgerard dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 02/02/2008, 18h56
  5. [PHP-JS] besoin d'aide pour menu déroulant avec lien
    Par Damarus dans le forum Langage
    Réponses: 3
    Dernier message: 06/10/2005, 19h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo