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 :

tkinter - réutiliser une "Entry" dans une fonction [Python 3.X]


Sujet :

Tkinter Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    ingénieur BTP
    Inscrit en
    Novembre 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur BTP

    Informations forums :
    Inscription : Novembre 2022
    Messages : 6
    Points : 5
    Points
    5
    Par défaut tkinter - réutiliser une "Entry" dans une fonction
    Bonjour,

    Voici un problème qui m'a occupé une bonne partie de l'après midi, j'ai trouvé quelques pistes sur ce forum mais qui n'ont pas abouties, et je ne comprends pas pourquoi...

    Voici un extract "réduit" du code de mon appli que j'ai adapté par soucis de lisibilité. Je voudrais que la valeur de mon Entry() "test_entry" soit réutilisée dans les fonctions appelées dans mes boutons.

    Soit je mets un ".get()" à mon entrée en ligne 20 et on me sort directement l'erreur : AttributeError: 'NoneType' object has no attribute 'get'
    soit je n'en mets pas, la fenetre s'ouvre mais les boutons ne fonctionnent pas et j'ai l'erreur TypeError: float() argument must be a string or a real number, not 'NoneType'

    Je comprends donc que mon entry (réutilisée en get() ou non) est "vide", mais je ne comprends pas.

    Please help ?

    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
    from tkinter import *
     
    window1 = Tk()
    window1.title("test")
    window1.geometry("1000x600")
    window1.config(background='#4d4644')
     
    variabletest = 0
     
     
    def incrementer():
        global variabletest
        global test_entry_var
        variabletest = float(test_entry_var) + 100
     
     
    default_entry = StringVar()
    default_entry.set("1")
    test_entry = Entry(window1, textvariable=default_entry, bg='#2c2827', fg='white', width=10).grid(row=0, column=0)
    test_entry_var = test_entry.get()
     
    Button(window1, text="buy", command=incrementer).grid(row=1, column=0)
     
    labelsortie = Label(text="réponse : " + str(variabletest) + "test_entry= " + str(test_entry_var))
    labelsortie.grid(row=1, column=1)
     
     
    def maj():
        global test_entry_var
        labelsortie['text'] = "réponse à jour : " + str(variabletest) + " test_entry=" + str(test_entry_var)
     
     
    Button(window1, text="MAJ", command=maj).grid(row=2, column=1)
     
    window1.mainloop()

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par pythygégé Voir le message
    Je comprends donc que mon entry (réutilisée en get() ou non) est "vide", mais je ne comprends pas.
    Il suffit de regarder où est assigné test_entry: ligne 19, on, a:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
              test_entry = Entry(window1, textvariable=default_entry, bg='#2c2827', fg='white', width=10).grid(row=0, column=0)
    Et si Entry(...) retourne une instance d'Entry, lui appliquer "grid" retournera None dans la variable qu'on souhaite utiliser plus tard.
    => il faut le faire en 2 lignes: création du widget, puis affichage.

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

  3. #3
    Invité
    Invité(e)
    Par défaut
    Salut !

    Effectivement Wiz a raison, j'aurais fait ton script autrement :

    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
    import tkinter as tk
     
    window1 = tk.Tk()
    window1.title("test")
    #window1.geometry("1000x600")
    window1.config(background='#4d4644')
     
    variabletest = 0
     
    def incrementer():
        global variabletest
        variabletest += int(test_entry.get())
        labelsortie['text'] = "Résultat : " + str(variabletest) + " (Incrément : " + test_entry.get() + ')'
     
     
    test_entry = tk.Entry(window1, bg='#2c2827', fg='white', width=10)
    test_entry.insert(0, '1')
    test_entry.grid(row=0, column=0)
     
    tk.Button(window1, width = 10, text="Buy", command=incrementer).grid(row=0, column=1)
     
    labelsortie = tk.Label(window1, width=30, text="Résultat : " + str(variabletest) + " Incrément : " + test_entry.get())
    labelsortie.grid(row=1, column=0, columnspan = 2, pady = 5) 
     
    window1.mainloop()

  4. #4
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Hello,

    Une autre proposition,

    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
    import tkinter as tk
    import logging
     
     
    def incrementer():
        value = entry.get()
        variables["values"].append(value)
        try:
            value = int(value)
        except ValueError as err:
            logger.error(str(err))
            entry.delete(0, tk.END)
            entry.focus_set()
            return
        variables["value"] = value
        variables["total"] += value
        label["text"] = f"Résultat: {variables['total']} Incrément: {variables['value']}"
        entry.delete(0, tk.END)
        entry.focus_set()
     
     
    logger = logging.getLogger(__name__)
     
     
    variables = {
        "values": [],
        "total": 0,
    }
     
    window = tk.Tk()
     
    entry = tk.Entry(window, bg='#2c2827', fg='white', width=10)
    entry.grid(row=0, column=0)
     
    tk.Button(window, width=10, text="Buy", command=incrementer).grid(row=0, column=1)
     
    label = tk.Label(window, width=30, text="Résultat : 0  Incrément : 0")
    label.grid(row=1, column=0, columnspan=2, pady=5)
     
    window.mainloop()
    Je suis pas fan des variables globales... Petite attention sur les noms de variable.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  5. #5
    Futur Membre du Club
    Homme Profil pro
    ingénieur BTP
    Inscrit en
    Novembre 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur BTP

    Informations forums :
    Inscription : Novembre 2022
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Merci à tous les trois

    En effet wiztricks erreur d'inattention de ma part. Merci ca fonctionne comme ca !
    Le Narvalo merci c'est beaucoup plus élégant et efficace comme ca je vais partir sur ta proposition. Ta méthode de mise à jour des labels va simplifier un peu tout mon programme, j'en ai quelques uns à modifier dans ce sens !
    fred1599, je me garde ta solution dans un coin pour étudier le module logging un peu plus tard (pour l'instant je ne comprends pas bien comment elle fonctionne)

  6. #6
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Citation Envoyé par pythygégé Voir le message
    fred1599, je me garde ta solution dans un coin pour étudier le module logging un peu plus tard (pour l'instant je ne comprends pas bien comment elle fonctionne)
    Hello,

    Le module logging est un module permettant d'indiquer par message des informations selon différents types de catégories (info, erreur, warning, ...). Dans notre cas ci-dessous, c'est un "print" amélioré pour indiquer les erreurs d'écriture dans ton entry, mais ça peut bien plus (voir sa documentation).

    Tu pourrais très bien le retirer et mettre une fonction print à la place.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  7. #7
    Futur Membre du Club
    Homme Profil pro
    ingénieur BTP
    Inscrit en
    Novembre 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur BTP

    Informations forums :
    Inscription : Novembre 2022
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Ca roule merci, je vais creuser ce module je passe en résolu

  8. #8
    Invité
    Invité(e)
    Par défaut
    Youpi, j'ai gagné !

    Par contre comme évoqué par fred1599 il faudrait contrôler l'entrée, càd faire en sorte que le script ne plante pas si au lieu de taper un nombre tu tapes des lettres par exemple.

    En réalité fred1599 aurait du gagner...

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

Discussions similaires

  1. [Python 3.X] tkinter - réutiliser une "Entry" dans une fonction
    Par pythygégé dans le forum Général Python
    Réponses: 3
    Dernier message: 15/11/2022, 13h26
  2. Réutiliser une fonction dans une autre
    Par MarlyM dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 17/04/2016, 22h02
  3. réutiliser une fonction
    Par morgan47 dans le forum Langage
    Réponses: 5
    Dernier message: 13/10/2009, 21h30
  4. Réutiliser une fonction
    Par Serendipity dans le forum Langage
    Réponses: 4
    Dernier message: 27/10/2008, 18h20
  5. Réponses: 8
    Dernier message: 10/01/2007, 21h10

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