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 :

Comment modifier un Label suite à commande lancé par Button ?


Sujet :

Tkinter Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    ingénieur CEM
    Inscrit en
    Juillet 2016
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : ingénieur CEM
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2016
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Comment modifier un Label suite à commande lancé par Button ?
    Bonjour,

    Difficile pour moi de trouver le titre ...

    Donc voici mon pb. Je créé une fenêtre avec un titre, des boutons, une zone de saisie et une zone de texte. Ce bout de code est censé ouvrir une fenêtre et proposer à l'interlocuteur un certain nombre de choix de tirage de dé, puis lui renvoyer le résultat dans une zone Label modifiée en fonction du résultat. Pour l'instant, toutes les fonctions de calculs de tirage sont validées et maintenant, je travaille sur l'interface graphique. C'est pour cela que sur les différents softs que vous verrez ci-dessous, il y a pas mal de lignes en argument sur la partie graphique.

    Mon historique de programmation sont principalement turbo-pascal orienté objet et ada. Donc j'ai été formé à une certaine rigueur dont je ne peux me démettre --> Trop vieux ;-)

    Après avoir navigué sur différents tutoriaux pour arriver à sortir qqchose en interface graphique, j'ai trouvé ce genre de code :
    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
    import Tkinter as tk
     
    counter = 0 
    def counter_label(label):
      def count():
        global counter
        counter += 1
        label.config(text=str(counter))
        label.after(1000, count)
      count()
     
     
    root = tk.Tk()
    root.title("Counting Seconds")
    label = tk.Label(root, fg="green")
    label.pack()
    counter_label(label)
    button = tk.Button(root, text='Stop', width=25, command=root.destroy)
    button.pack()
    root.mainloop()
    D'après ce que je comprends, ce code modifie le texte du Label "label" dans une fonction "counter_label". Par contre, je ne vois aucun "return" dans la fonction "counter_label" pour renvoyer proprement les modifications faites sur le Label "label". Et là, voyez-vous, i'm chocking ...

    Donc, j'ai réalisé un bout de code pour tester tout cela. Il y a le code principal qui fait appel à "fenetre_choix.py" qui va utiliser des fonctions de "fonctions_jeux.py". Toutes les fonctions présentes dans "fonctions_jeux.py" ne font que du calcul mathématique, ne renvoie qu'une valeur, ont été testées et fonctionnent. Le pb se trouve dans "fenetre_choix.py".

    Première question : comment gérer le renvoi d'une fonction appelée par "command=" d'un widget Button ? (choix_lancement_de dans le script renvoie la valeur calculée mais comment faire avec "command=")

    Deuxième question : Comment modifier proprement le textvariable du Label "txt2_fen_lancement_de" ? (utiliser le renvoi de la fonction "choix_lancement_de" dans la fonction "cmd_lancement_de")

    Troisième question : Rentrer une valeur dans la fenêtre de saisie génère une erreur. Je pense que je ne maîtrise pas du tout le widget Entry ... (tjs le même espoir ... appeler la fonction avec des arguments et la dite fonction renvoie un résultat ...

    code principal "fenetre_generale":
    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
    from tkinter import * # module de gestion de l'interface graphique du prg
    from fonctions_jeux import * # module contenant la boite a outils pour les calculs de nombres aleatoires
    from fenetres_choix import * # module contenantla gestion des differentes fenetres choisies dans la fenetre principale
     
    fen_g = Tk()
    fen_g.title('Tirage aleatoire')
     
    b1_fen_g = Button(fen_g, text='Tirage purement aleatoire', command=cmd_lancement_de)
    b1_fen_g.grid(row=1, padx=5, pady=5)
     
    #b2_fen_g = Button(fen_g, text='Tirage aleatoire pondere basique', command=cmd_pondere_basique)
    #b2_fen_g.grid(row=2, padx=5, pady=5)
    #
    #b3_fen_g = Button(fen_g, text='Tirage aleatoire pondere gaussien', command=cmd_pondere_gaussien)
    #b3_fen_g.grid(row=3, padx=5, pady=5)
    #
    #b4_fen_g = Button(fen_g, text='Tirage aleatoire pondere "triangulaire"', command=cmd_pondere_triangulaire)
    #b4_fen_g.grid(row=4, padx=5, pady=5)
     
    b5_fen_g = Button(fen_g, text='Quitter', command=fen_g.quit)
    b5_fen_g.grid(row=5, padx=5, pady=5)
     
    fen_g.mainloop()
     
    fen_g.destroy()
    La fonction appelée par le code "fenetre_principale" :
    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
    from tkinter import * # module de gestion de l'interface graphique du prg
    from fonctions_jeux import * # module contenant la boite a outils pour les calculs de nombres aleatoires
     
     
    def choix_lancement_de(valeur):
     
        if valeur &gt 1 :
            resultat = lancement_de(valeur)
            if valeur == 2 :
                if resultat == 1 : piece = "PILE"
                if resultat == 2 : piece = "FACE"
                affichage_resultat = "Pile/Face = " + piece
            if valeur &gt 2 :
                affichage_resultat = "Resultat du De a " + str(valeur) + " faces = " + str(resultat)
        else : affichage_resultat = "Resultat = *****"
     
        return (affichage_resultat)
     
    def eval_valeur(event):
     
        choix_lancement_de(eval(entree1_fen_lancement_de.get()))
     
    def cmd_lancement_de():
     
        nb_de_face = "0"
     
        fen_lancement_de = Tk()
        fen_lancement_de.title('Tirage purement aleatoire')
     
        nb_de_face = StringVar()
        aff_resultat = StringVar()
     
        b1_fen_lancement_de = Button(fen_lancement_de, text='Pile ou Face', command = lambda x=2 : choix_lancement_de(x))
        b1_fen_lancement_de.grid(row=0, padx=5, pady=5)
     
        b2_fen_lancement_de = Button(fen_lancement_de, text='De a 4 faces', command = lambda x=4 : choix_lancement_de(x))
        b2_fen_lancement_de.grid(row=0, column=1, padx=5, pady=5)
     
        b3_fen_lancement_de = Button(fen_lancement_de, text='De a 6 faces', command = lambda x=6 : choix_lancement_de(x))
        b3_fen_lancement_de.grid(row=1, padx=5, pady=5)
     
        b4_fen_lancement_de = Button(fen_lancement_de, text='De a 10 faces', command = lambda x=10 : choix_lancement_de(x))
        b4_fen_lancement_de.grid(row=1, column=1, padx=5, pady=5)
     
        b5_fen_lancement_de = Button(fen_lancement_de, text='De a 20 faces', command = lambda x=20 : choix_lancement_de(x))
        b5_fen_lancement_de.grid(row=2, padx=5, pady=5)
     
        b6_fen_lancement_de = Button(fen_lancement_de, text='De a 100 faces', command = lambda x=100 : choix_lancement_de(x))
        b6_fen_lancement_de.grid(row=2, column=1, padx=5, pady=5)
     
        txt1_fen_lancement_de = Label(fen_lancement_de, text = 'Nombre de faces = ')
        txt1_fen_lancement_de.grid(row=3, padx=5, pady=5)
     
        entree1_fen_lancement_de = Entry(fen_lancement_de, textvariable = nb_de_face)
        entree1_fen_lancement_de.grid(row=3, column=1, padx=5, pady=5)
        entree1_fen_lancement_de.bind("<Return&gt", eval_valeur)
     
        b7_fen_lancement_de = Button(fen_lancement_de, text='Quitter', command=fen_lancement_de.quit)
        b7_fen_lancement_de.grid(row=4, padx=5, pady=5)
     
        txt2_fen_lancement_de = Label(fen_lancement_de, textvariable=aff_resultat)
        txt2_fen_lancement_de.grid(row=5, padx=5, pady=5)
     
     
        fen_lancement_de.mainloop()
        fen_lancement_de.destroy()
    Merci pour vos futures réponses.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 313
    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 313
    Points : 36 819
    Points
    36 819
    Par défaut
    Citation Envoyé par lhebui Voir le message
    Première question : comment gérer le renvoi d'une fonction appelée par "command=" d'un widget Button ? (choix_lancement_de dans le script renvoie la valeur calculée mais comment faire avec "command=")
    Avec Python, une fonction sans "return" explicite de quelque chose retournera None. Mais ici, la chose passée en paramètre via command ressemble à une fonction mais on préférera l'appeler "callback" car c'est la bibliothèque graphique qui l’appellera lors du click sur un Button et qui récupérera ce qu'elle retourne.

    Citation Envoyé par lhebui Voir le message
    Deuxième question : Comment modifier proprement le textvariable du Label "txt2_fen_lancement_de" ? (utiliser le renvoi de la fonction "choix_lancement_de" dans la fonction "cmd_lancement_de")
    A chaque appel à Tk() vous créez un nouvel espace de noms dans l'interpréteur TCL qui mouline derrière tkinter.
    Essayez un truc comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> import tkinter as tk
    >>> root = tk.Tk()
    >>> r2 = tk.Tk()
    >>> v = tk.StringVar()
    >>> entry = tk.Entry(r2, variable=v)
    >>> entry = tk.Entry(r2, textvariable=v)
    >>> entry.pack()
    Ici si on modifie l'entry et qu'on essaie de récupérer le texte qu'on a entré:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> v.get()
    ''
    >>> entry.get()
    'aaa'
    >>>
    surprise: il n'y a rien dans le StringVar alors qu'on a bien modifié l'Entry!
    Le soucis est que le tk.StringVar a été crée, par défaut, dans l'espace de noms associé à root: il n'est pas accessible depuis les objets crées dans l'espace de noms "r2"...
    Ca marcherait mieux en précisant "r2":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> v = tk.StringVar(master=r2)
    >>> entry.configure(textvariable=v)
    >>> v.get()
    'aaa'
    >>> entry.get()
    'aaa'
    Mais la bonne solution est de créer ses fenêtres secondaires via Toplevel() - plutôt que via Tk() qui fait "plus" certes mais c'est bien trop compliqué lorsqu'on débute et rarement utile "en général".

    Citation Envoyé par lhebui Voir le message
    Troisième question : Rentrer une valeur dans la fenêtre de saisie génère une erreur. Je pense que je ne maîtrise pas du tout le widget Entry ... (tjs le même espoir ... appeler la fonction avec des arguments et la dite fonction renvoie un résultat ...
    Ca plante certainement ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def eval_valeur(event):
     
        choix_lancement_de(eval(entree1_fen_lancement_de.get()))
    Essentiellement parce que la variable "entree1_fen_lancement_de" que vous avez associée un objet Entry dans "cmd_lancement_de" est "locale".
    Et si vous ne maîtrisez pas encore variables globales/locales, il va falloir passer un peu de temps dans votre tuto. préféré car les callback ne renvoyant pas de résultats exploitable communiquer avec le reste du programme passe par là, par la création d'objets et par une meilleure maîtrise de tkinter.

    - W

Discussions similaires

  1. Réponses: 6
    Dernier message: 31/12/2013, 15h16
  2. Réponses: 2
    Dernier message: 15/05/2008, 21h13
  3. Comment modifier l'heure d'un fichier par calcul
    Par JLC2_ dans le forum Windows XP
    Réponses: 2
    Dernier message: 08/09/2006, 16h59
  4. Problème d'encodage d'une commande lancée par java
    Par Pointu dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 29/04/2006, 00h35
  5. [Débutant(e)] Ou trouver la commande lancée par eclipse
    Par Emdis dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 25/11/2004, 11h00

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