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 :

Probleme avec methode dans un Button


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mai 2013
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 54
    Par défaut Probleme avec methode dans un Button
    Bonjour a tous,

    Quelqu'un peut-il m'expliquer pourquoi je ne peu pas faire entry.delete(0, END) dans un bouton directement.

    Pour que sa soit plus clair je vous met mon code qui ne marche pas:

    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
     
    from tkinter import *
     
    def calcul():
     
        donnee.insert(END, " = " + str(eval(donnee.get())))
     
    root = Tk()
    root.title("Calcul")
     
    donnee = Entry(root, width = 21)
    donnee.pack()
     
    Button(root, width = 5, text = "Calcul", command = calcul).pack(side = LEFT)
    Button(root, width = 5, text = "Clean", command = donnee.delete(0, END)).pack(side = LEFT)
    Button(root, width = 5, text = "Quit", command = root.quit).pack()
     
    root.mainloop()
    root.destroy()
    La seul facon que j'ai trouvé pour que sa marche c'est celle-ci en passant par une fonction:

    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
     
    from tkinter import *
     
    def calcul():
     
        donnee.insert(END, " = " + str(eval(donnee.get())))
     
    def clean():
     
        donnee.delete(0, END)
     
    root = Tk()
    root.title("Calcul")
     
    donnee = Entry(root, width = 21)
    donnee.pack()
     
    Button(root, width = 5, text = "Calcul", command = calcul).pack(side = LEFT)
    Button(root, width = 5, text = "Clean", command = clean).pack(side = LEFT)
    Button(root, width = 5, text = "Quit", command = root.quit).pack()
     
    root.mainloop()
    root.destroy()
    Et autre question, pourquoi je ne peu pu rien faire sur mon Entry si je lui applique la méthode pack directement "Entry(root).pack()" au lieu de passer par sa variable "donnee.pack()"

    C'est deux problème mon donné quelque heure de mal de tête, j'ai fini par trouver la solution, mais je ne comprend pas pourquoi sa marchais pas???

  2. #2
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    Lors de la création du Widget Button une fonction est stockée dans l'option command de celui-ci, que vous le spécifiez ou pas, pour être exécutée lors de l’événement souris.
    En Python si le nom d'une fonction est suivit de () celle ci est exécutée et retourne quelque chose, dans tous les cas. Cela peux être un objet (liste, int, instance, etc...) ou None.
    Lorsque vous écrivez command = donnee.delete(0, END) lors de la création du Button le .delete(0, END) est exécute et son résultat (None) est stocké dans command.
    C'est bien d'avoir trouver la fonction clean(). Vous pouvez aussi utiliser une fonction anonyme avec lambda :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    command = lambda : donnee.delete(0, END)
    Cela reviens à la même chose si ce n'est que la fonction n'est pas nommée pour Python.

    Il en vas de même pour .pack() qui retourne None.
    Dans donnee = Entry(root).pack() donnee==None.

    @+

  3. #3
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mai 2013
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 54
    Par défaut
    Haaaa, c'est un peu plus clair.

    Et bien pour les intéressés, je vous laisse mon code d'une calculatrice simplifier (j'ai rien inventé, j'ai repris des exemples ici et là)

    C'est une calculatrice très forte, on peut même travailler sur des chaines de caractère si on veux (bien que sa donne pas grand chose... ) Exemple: si on écrit "allo".upper() et bien sa nous donne = ALLO. On peut également obtenir le nombre pi en tapant simplement pi (sans guillemet) et plein d'autre chose comme sa...

    Mon but dans ce programme, était surtout de compacter le code en le moins de ligne possible, donc si quelqu'un a des idées pour le compacter encore plus, j'aimerais bien voir votre 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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    from tkinter import *
    from math import *
     
    root = Tk() # Fenetre principal
    root.title("Calcul") # Titre
    #root.resizable(width = 0, height = 0) # Non redimentionable
     
    x, y = 160, 45 # Dimension de "root"
    xScreen, yScreen = root.winfo_screenwidth(), root.winfo_screenheight() # Dimension écran
    root.geometry("%dx%d+%d+%d" % (x, y, xScreen/2 - x/2, yScreen/2 - y/2)) # Centrage de "root" dans l'écran
     
    donnee = Entry(root, width = 26, bg = "light blue") # Zone de saisi
    donnee.pack()
    donnee.focus() # Met le curseur dans "donnee"
     
    # Lorsqu'on appuie sur le bouton, on reprend les valeurs entrées par l'utilisateur dans "donnee"
    # et avec "eval" on effectue l'opération écrite pas l'utilisation (Ex: 10 + 15), on converti cette
    # valeur en string avec "str" et on rajoute avec "insert" le resultat à la fin
    # avec "END" (Ex: 10 + 15 = 25)
    Button(root, width = 5, text = "Calcul", bg = "light grey", command = lambda: donnee.insert(
               END, " = " + str(eval(donnee.get())))).pack(side = LEFT)
     
    # Lorsqu'on appuie sur le bouton, on efface avec "delete" le contenue de "donnee" en partant
    # de l'indice "0" jusqu'a la fin "END"
    Button(root, width = 5, text = "Clean", bg = "light grey", command = lambda: donnee.delete(
               0, END)).pack(side = LEFT)
     
    # Lorsqu'on appuie sur le bouton, on applique la méthode "quit" à la fenêtre principal
    Button(root, width = 5, text = "Quit",  bg = "light grey",
           command = root.quit).pack()
     
    root.mainloop()
    root.destroy()

  4. #4
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Citation Envoyé par PascalStl Voir le message
    Mon but dans ce programme, était surtout de compacter le code en le moins de ligne possible
    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
     
    from tkinter import *
     
     
    root = Tk()
    root.title("Calcul")
    root.geometry("%dx%d+%d+%d" % (160, 45, root.winfo_screenwidth()/2-160/2,
                                   root.winfo_screenheight()/2-45/2))
    donnee = Entry(root, width=26, bg="light blue")
    donnee.pack() or donnee.focus()
    for txt, cmd in (("Calcul", lambda: donnee.insert(END, " = "+str(eval(donnee.get())))),
                     ("Clean", lambda: donnee.delete(0, END)),
                     ("Quit", root.destroy)):
        Button(root, width=5, text=txt, bg ="light grey", command=cmd).pack(side=LEFT) 
    root.mainloop()

  5. #5
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    from tkinter import *
     
     
    root = Tk()
    root.geometry("%dx%d+%d+%d" % (160, 45, root.winfo_screenwidth()/2-160/2,
                                   root.winfo_screenheight()/2-45/2)) or root.title("Calcul")
    donnee = Entry(root, width=26, bg="light blue")
    donnee.pack() or donnee.focus()
    for txt, cmd in (("Calcul", lambda: donnee.insert(END, " = "+str(eval(donnee.get())))),
                     ("Clean", lambda: donnee.delete(0, END)),
                     ("Quit", root.destroy)):
        Button(root, width=5, text=txt, bg ="light grey", command=cmd).pack(side=LEFT)
    root.mainloop()
    8 lignes mais bon... Readability counts.

  6. #6
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mai 2013
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 54
    Par défaut
    pas pire pantoute ,

    Ya juste le "or" dans "donnee.pack() or donnee.focus()" que je comprend pas

    sa veux dire "ou", donc l'ordi exécute soit un ou l'autre, est-ce que c'est sa?

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

Discussions similaires

  1. probleme avec methode get
    Par Tr@nkill dans le forum ASP
    Réponses: 2
    Dernier message: 12/05/2005, 13h54
  2. Probleme avec guillemets dans commande HREF
    Par angelevil dans le forum ASP
    Réponses: 4
    Dernier message: 02/05/2005, 19h06
  3. [ADO.NET] Problème avec Insert dans base de données
    Par mpascolo dans le forum Accès aux données
    Réponses: 9
    Dernier message: 24/01/2005, 09h36
  4. [C#] Probleme avec TextBox dans un DataGrid
    Par Oberown dans le forum ASP.NET
    Réponses: 4
    Dernier message: 21/12/2004, 16h05
  5. [langage] Probleme avec caractère '$' dans script Perl
    Par zouetchou dans le forum Langage
    Réponses: 11
    Dernier message: 24/07/2004, 15h35

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