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 :

Actualisation dynamique d'un paramètre de Menu tkinter. [Python 3.X]


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2019
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nicaragua

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2019
    Messages : 68
    Par défaut Actualisation dynamique d'un paramètre de Menu tkinter.
    Bonjour

    Dans mon projet d'application en python, il y a 2 modes : le mode "Feuilletage" (le mode par défaut) et le mode "Édition". Pour passer de l'un à l'autre, on va dans le menu "Édition" et on choisit la ligne correspondante. (J'ajouterai peut-être un bouton de bascule après...)
    Je voudrais :
    --> en mode "Feuilletage", que seule la ligne "Mode édition" soit cliquable et "Mode feuilletage" soit désactivé (grisé).
    --> en mode "Édition", que seule la ligne "Mode feuilletage" soit cliquable et "Mode édition" soit désactivé (grisé).

    J'arrive à faire un affichage dynamique du texte d'un "Label" ou d'un "Button".
    Ça fonctionne bien. Cependant, le changement "dynamique" des valeurs de mes "StringVar" ne semblent pas affecter (dynamiquement) les paramètres du menu... Ils sont affectés au démarrage et puis c'est fini...

    J'ai réalisé un programme minimaliste pour isoler et résoudre le problème mais je ne trouve toujours pas la faille... Le voici :

    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
    # Essai de modification d'un paramère de menu
    import tkinter as tk
    root = tk.Tk()
    root.geometry("200x100")
     
    # Création des variables de contrôle édition / feuilletage (griser les menus
    a = tk.StringVar(master=root)
    b = tk.StringVar(master=root)
     
    # Création de la fenêtre contenant les informations
    bar_menu = tk.Menu(root)
    root.config(menu=bar_menu)
     
    # Fonctions activées par les menus
    def mode_feuil():              # Griser "Feuilletage" et activer "Édition"
        a.set("disabled")
        b.set("active")
     
    def mode_edit():               # Griser "Édition" et activer "Feuilletage"
        a.set("active")
        b.set("disabled")
     
    def menu():
        mode_feuil()
        # Menu "Fichier"
        fichier = tk.Menu(bar_menu, tearoff=0)
        fichier.add_command(label="Fermer", command=quit)
        bar_menu.add_cascade(label="Fichier", menu=fichier)
        # Menu "Edition"
        edition = tk.Menu(bar_menu, tearoff=0)
        edition.add_command(label="Mode feuilletage", command=mode_feuil, state=a.get())
        edition.add_command(label="Mode édition", command=mode_edit, state=b.get())
        bar_menu.add_cascade(label="Édition", menu=edition)
     
    label = tk.Label(root, textvariable=a)
    label.pack()
    bouton1 = tk.Button(root, textvariable=a, command=mode_feuil)
    bouton1.pack()
    bouton2 = tk.Button(root, textvariable=b, command=mode_edit)
    bouton2.pack()
     
    menu()
    mode_feuil()
     
    root.mainloop()
    Auriez-vous une idée de comment affecter dynamiquement le paramètre "state" d'un menu ?

    Merci à vous

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Citation Envoyé par Yobeco Voir le message
    Auriez-vous une idée de comment affecter dynamiquement le paramètre "state" d'un menu ?
    L'entrée d'un menu n'est pas un widget (d'ailleurs .add_command ne retourne rien).

    Par contre, les entrées sont indexées (le numéro de l'index suit l'ordre des ajouts) et il y a des méthodes pour modifier l'entrée à l'index n (.entryconfigure).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre éprouvé
    Inscrit en
    Juillet 2013
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 80
    Par défaut
    Bonjour,

    Je ne suis pas certain de comprendre l'intérêt des stringvar dans cette situation... est-ce que ceci convient ?

    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
    # Essai de modification d'un paramère de menu
    import tkinter as tk
    root = tk.Tk()
    root.geometry("200x100")
     
    def mode_feuil():              # Griser "Feuilletage" et activer "Édition"
        b1.configure(state="disabled")
        b2.configure(state="active")
     
    def mode_edit():               # Griser "Édition" et activer "Feuilletage"
        b2.configure(state="disabled")
        b1.configure(state="active")
     
    # Creating buttons
    b1 = tk.Button(root, text='Feuilletage', command=mode_feuil)
    b2 = tk.Button(root, text='Edition', command=mode_edit)
     
    #Pack buttons
    b1.pack()
    b2.pack()
     
    # Default state
    mode_feuil()
     
    # Run !
    root.mainloop()

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Citation Envoyé par charliemtx Voir le message
    Je ne suis pas certain de comprendre l'intérêt des stringvar dans cette situation... est-ce que ceci convient ?
    Ca convient pour des Button (ou d'autres widgets).
    Ici le problème est de modifier les entrées d'un Menu.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Après avoir eu/pris le temps de coder un exemple, çà donne un truc du genre:
    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
    from tkinter import *
     
    labels = list('ABC')
     
    root=Tk()
     
    def do_reset():
        for i in range(len(labels)):
            menu.entryconfig(i+1,state=NORMAL)
     
    menu = Menu(root)
    for i, label in enumerate(labels, start=1):
        menu.add_command(label=label,
            command=lambda i=i: menu.entryconfig(i,state=DISABLED))
     
    menu.add_command(label="Reset", command=do_reset)
    menu.add_command(label="Exit", command=root.quit)
     
    root.config(menu=menu)
    root.mainloop()
    mais il y a d'autres possibilités...

    Et il faut prendre le temps de lire la documentation pour commencer à imaginer tout ce qu'on peut faire avec les Menu.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2019
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nicaragua

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2019
    Messages : 68
    Par défaut
    Merci à tous

    Comme d'habitude, Wiztricks, quand je lis un de tes codes, s'ouvre à moi une mine de concepts à découvrir et à digérer...
    Je vais m'y atteler dés que possible (les cours ayant repris, j'ai moins de temps libre maintenant. )

    Juste pour information : le bouton "Exit" ne fonctionne que si j'enlève root. dans command=root.quit

    De mon côté, j'avais élaboré ce code-ci (que je sais qualifiable de "naïf" ) :
    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
    import tkinter as tk
    root = tk.Tk()
    root.geometry("200x100")
     
    bar_menu = tk.Menu(root)
    root.config(menu=bar_menu)
     
    feuil = True       # Variable mémorisant le mode : Édition (feuil = False) ou Feuilletage (feuil = True)
     
    # Fonctions activées par les menus
    def bascul_mod(menu):
        global feuil                                           # Rendre la variable accessible
        if feuil == True:                                      # Selon le mode en cours, grise le menu correspondant
            index_1 = 1
            index_2 = 0
        else:
            index_1 = 0
            index_2 = 1
        menu.entryconfigure(index_1, state="disabled")         # Fixer l'état du paramètre "state=" dans l'entrée choisie du menu
        menu.entryconfigure(index_2, state="active")
        feuil = not feuil                                      # Basculer le booléen pour changer de mode
        affich_mod()                                           # Afficher le mode dans lequel on est
     
    def affich_mod():                                          # Fonction pour afficher le mode en cours
        global feuil
        if feuil == True:
            print('Mode "Feuilletage" activé')
        else:
            print('Mode "Édition" activé')
     
    # Création du menu
    def menu():
        global feuil
        global edition
        # Menu "Fichier"
        fichier = tk.Menu(bar_menu, tearoff=0)                 # Ne pas permettre au menu d'être décroché
        fichier.add_command(label="Fermer", command=quit)
        bar_menu.add_cascade(label="Fichier", menu=fichier)
     
        # Menu "Edition"
        edition = tk.Menu(bar_menu, tearoff=0)
        edition.add_command(label="Mode feuilletage", command=lambda: bascul_mod(edition), state="disable")     # ou "disabled"
        edition.add_command(label="Mode édition", command=lambda: bascul_mod(edition), state="active")
        print()
        bar_menu.add_cascade(label="Édition", menu=edition)
     
        affich_mod()
     
    menu()
     
    bout_basc = tk.Button(root, text="Changer de mode", command=lambda: bascul_mod(edition))
    bout_basc.pack()
     
    root.mainloop()
    Il a la qualité de fonctionner. Les menus et le bouton réagissent comme je le souhaite. Si vous avez des remarques... Je suis ouvert.

    Cependant, je n'ai pas encore réussi à utiliser la méthode .index() qui permet de déterminer, si j'ai bien compris, l'index de l'entrée d'un menu grâce à son label. (J'y reviendrai dés que possible)

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

Discussions similaires

  1. Passer une variable de classe en paramètre d'un menu
    Par Xaziou dans le forum Composants graphiques
    Réponses: 4
    Dernier message: 11/05/2011, 16h30
  2. Passage paramètres Grid et Menu
    Par sbernard dans le forum Ext JS / Sencha
    Réponses: 3
    Dernier message: 23/06/2010, 10h56
  3. [2K5] Actualisation liste avec paramètre NULL
    Par Lolomenfin dans le forum SSRS
    Réponses: 1
    Dernier message: 28/02/2009, 11h36
  4. Menu Tkinter avec lien dans label d'un sous-menu
    Par quentinlecler dans le forum Tkinter
    Réponses: 4
    Dernier message: 09/07/2008, 09h51
  5. problème menu Tkinter
    Par pedro99 dans le forum Tkinter
    Réponses: 1
    Dernier message: 06/11/2007, 20h09

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