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 :

Calculatrice simple- event button [Débutant(e)]


Sujet :

Tkinter Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 7
    Points : 4
    Points
    4
    Par défaut Calculatrice simple- event button
    Bonjour à tous,
    Je suis un débutant donc excusez moi si je n'emploie pas les bons thermes ou quoi que ce soit
    Pour un dossier à effectuer à l'école, je me suis lancé dans la programmation python et donc, d'une calculatrice.
    Bien sur, me voilà bloqué.
    J'ai utilisé un code permettant d'entrer mes chiffres au clavier (dans une entry) et lorsque j'appuie sur "enter", le résultat y est affiché en dessous.

    J'ai donc placé des button en dessous et j'aimerais créer un event qui détermine que lorsque j'appuie sur le bouton "1", que le chiffre 1 s'affiche dans "entry"

    si vous pouvez au moins m'expliquer comment marche cette fonction, ça m'aiderait vraiment

    (Je devrais aussi ajouter une fonction racine carré, conversion binaire et hexadecimal mais, un problème à la fois)

    Merci de votre aide d'avance

    Voici mon 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
    35
    36
    from tkinter import * 
    from math import *
    #importation de la bibliotheque Tkinter et math
    def evaluer(event):
    	chaine.configure(text = "resultat=" + str(eval(entree.get())))
     
    fenetre = Tk()
    fenetre.geometry("400x500") #definis la taille de la fenetre
    fenetre.title ('Calculatrice') #Nom de la fenetre
     
    entree = Entry(fenetre)
    entree.bind("<Return>", evaluer)#fait en sorte qu'un evenement se produit lorsque l'on appuye sur enter
    chaine = Label(fenetre)#Modifie l'attribut "texte" lors de l'evenement
     
    entree.grid(row=0, column=1)
    chaine.grid()
     
    bou1 = Button(fenetre, text='1', width =8).grid(row =4, column =0)
    bou2 = Button(fenetre, text='2', width =8).grid(row =5, column =0)
    bou3 = Button(fenetre, text='3', width =8).grid(row =6, column =0)
    bou4 = Button(fenetre, text='4', width =8).grid(row =4, column =1)
    bou5 = Button(fenetre, text='5', width =8).grid(row =5, column =1)
    bou6 = Button(fenetre, text='6', width =8).grid(row =6, column =1)
    bou7 = Button(fenetre, text='7', width =8).grid(row =4, column =2)
    bou8 = Button(fenetre, text='8', width =8).grid(row =5, column =2)
    bou9 = Button(fenetre, text='9', width =8).grid(row =6, column =2)
    bou0 = Button(fenetre, text='0', width =8).grid(row =7, column =1)
    boupoint = Button(fenetre, text=',', width =8).grid(row =7, column =0)
    bouegale = Button(fenetre, text='=', width =8).grid(row =7, column =2)
    bouplus = Button(fenetre, text='+', width =8).grid(row =4, column =3)
    boumoins = Button(fenetre, text='-', width =8).grid(row =5, column =3)
    boufois = Button(fenetre, text='x', width =8).grid(row =6, column =3)
     
     
    #Placement des boutons
    fenetre.mainloop()

  2. #2
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Bonjour,
    S'il vous plaît: utilisez l'icône "#" en haut à droite afin d'insérer votre code…
    Merci d'avance.

    Clodion

  3. #3
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Citation Envoyé par Luggy Voir le message
    Bonjour à tous,
    Je suis un débutant donc excusez moi si je n'emploie pas les bons thermes ou quoi que ce soit
    Pour un dossier à effectuer à l'école, je me suis lancé dans la programmation python et donc, d'une calculatrice.

    J'ai donc placé des button en dessous et j'aimerais créer un event qui détermine que lorsque j'appuie sur le bouton "1", que le chiffre 1 s'affiche dans "entry"

    si vous pouvez au moins m'expliquer comment marche cette fonction, ça m'aiderait vraiment
    Bonjour,
    1) bt = Button(…).grid()
    => bt reçoit la valeur de grid (et ne fait donc pas référence à Button(…)
    2) "bou1 = Button(fenetre, text='1', width =8).grid(row =4, column =0)"
    => regarder dans un manuel tkinter l'utilisation de la classe Button.
    => il y a des livres gratuits (sur ce site même)!!
    3) Dans le meilleur tuto sur Python en Français, écrit par G. Swinnen, gratuit, disponible sur le site… Il y a très rapidement la réalisation d'une calculatrice!!

    Clodion

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par Clodion Voir le message
    Bonjour,
    1) bt = Button(…).grid()
    => bt reçoit la valeur de grid (et ne fait donc pas référence à Button(…)
    2) "bou1 = Button(fenetre, text='1', width =8).grid(row =4, column =0)"
    => regarder dans un manuel tkinter l'utilisation de la classe Button.
    => il y a des livres gratuits (sur ce site même)!!
    3) Dans le meilleur tuto sur Python en Français, écrit par G. Swinnen, gratuit, disponible sur le site… Il y a très rapidement la réalisation d'une calculatrice!!

    Clodion
    Un grand merci Clodion, je n'avait pas pensé à l’équivalence des boutons avec grid
    Je suis partis pour tout refaire..

  5. #5
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Citation Envoyé par Luggy Voir le message
    Un grand merci Clodion, je n'avait pas pensé à l’équivalence des boutons avec grid
    Je suis partis pour tout refaire..
    Bonsoir!!
    Non, ce n'est pas un problème avec grid! C'est juste que grid() renvoie toujours la même chose (de mémoire: None) et donc que tous vos noms de boutons auront la même valeur et seront donc inexploitable. Il suffit juste de faire:
    bt = Button(…)
    bt.grid(…)

    Et la variable bt contient une référence à votre bouton!

    Le plus important est de voir puis comprendre les widgets de tkinter!!

    Clodion

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par Clodion Voir le message
    Bonsoir!!
    Non, ce n'est pas un problème avec grid! C'est juste que grid() renvoie toujours la même chose (de mémoire: None) et donc que tous vos noms de boutons auront la même valeur et seront donc inexploitable. Il suffit juste de faire:
    bt = Button(…)
    bt.grid(…)

    Et la variable bt contient une référence à votre bouton!

    Le plus important est de voir puis comprendre les widgets de tkinter!!

    Clodion
    Bonsoir,

    Donc, si j'ai bien compris (ce qui m'étonnerait, à ma grande habitude),
    mon code devrait ressembler à ceci pour que les boutons soient fonctionnels?
    Excusez moi encore de mon niveau de novice.
    D'ailleurs, j'ai déjà commencer à lire le livre de G. Swinnen, en effet, il évoque une calculatrice minimaliste (c'est de là que je tiens le début de mon code) et justement, je souhaiterais seulement bind des boutons dans la sélection (j'espère que mon idée tient la route..) mais je n'ai pas trouvé sur google une explication qui pourrait m'informer de "comment faire" ou alors je tape de mauvais mots clef.


    Merci à vous Clodion de vous intéresser à mon problème
    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
    bou1 = Button(fenetre, text='1', width =8)
    bou1.grid(row =4, column =0)
    bou2 = Button(fenetre, text='2', width =8)
    bou2.grid(row =5, column =0)
    bou3 = Button(fenetre, text='3', width =8)
    bou3.grid(row =6, column =0)
    bou4 = Button(fenetre, text='4', width =8)
    bou4.grid(row =4, column =1)
    bou5 = Button(fenetre, text='5', width =8)
    bou5.grid(row =5, column =1)
    bou6 = Button(fenetre, text='6', width =8)
    bou6.grid(row =6, column =1)
    bou7 = Button(fenetre, text='7', width =8)
    bou7.grid(row =4, column =2)
    bou8 = Button(fenetre, text='8', width =8)
    bou8.grid(row =5, column =2)
    bou9 = Button(fenetre, text='9', width =8)
    bou9.grid(row =6, column =2)
    bou0 = Button(fenetre, text='0', width =8)
    bou0.grid(row =7, column =1)
    boupoint = Button(fenetre, text=',', width =8)
    boupoint.grid(row =7, column =0)
    bouegale = Button(fenetre, text='=', width =8)
    bouegale.grid(row =7, column =2)
    bouplus = Button(fenetre, text='+', width =8)
    bouplus.grid(row =4, column =3)
    boumoins = Button(fenetre, text='-', width =8)
    boumoins.grid(row =5, column =3)
    boufois = Button(fenetre, text='x', width =8)
    boufois.grid(row =6, column =3)

  7. #7
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Citation Envoyé par Luggy Voir le message
    Bonsoir,

    Donc, si j'ai bien compris (ce qui m'étonnerait, à ma grande habitude),
    mon code devrait ressembler à ceci pour que les boutons soient fonctionnels?
    Excusez moi encore de mon niveau de novice.
    D'ailleurs, j'ai déjà commencer à lire le livre de G. Swinnen, en effet, il évoque une calculatrice minimaliste (c'est de là que je tiens le début de mon code) et justement, je souhaiterais seulement bind des boutons dans la sélection (j'espère que mon idée tient la route..) mais je n'ai pas trouvé sur google une explication qui pourrait m'informer de "comment faire" ou alors je tape de mauvais mots clef.
    Bonsoir,
    Pour le code oui! À la condition que vous ayez besoin d'y revenir par la suite!
    Dans le livre de G. Swinenn, toutes les explications sont données! Cela veut dire qu'il faut le lire et expérimenter!! Il faut faire les petits exercices qui vont avec! C'est un tutoriel, un vrai!!
    Si certaines choses vous échappent, dites-le, au moins vous serez certain d'avoir compris!

    Clodion

  8. #8
    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
    Salut,

    Citation Envoyé par Luggy Voir le message
    Je suis un débutant donc excusez moi si je n'emploie pas les bons thermes ou quoi que ce soit
    Pour un dossier à effectuer à l'école, je me suis lancé dans la programmation python et donc, d'une calculatrice.
    Bien sur, me voilà bloqué.
    ...
    J'ai donc placé des button en dessous et j'aimerais créer un event qui détermine que lorsque j'appuie sur le bouton "1", que le chiffre 1 s'affiche dans "entry"
    Un "Button" peut (entre autres) afficher un texte qui, lorsqu'on clique dessus, va déclencher une "action".
    Cette action sera réalisée par une fonction dont le boulot pourra être d'ajouter du texte à une "entry".

    Pour faire çà, un Button, une Entry et une fonction suffisent:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> import tkinter as tk
    >>> root = tk.Tk()
    >>> entry = tk.Entry(root)
    >>> entry.pack()
    >>> def do_action():
    ...    entry.insert('end', 1)
    >>> button = tk.Button(root, text=1, command=do_action)
    >>> button.pack()
    >>> root.mainloop()
    Bien sûr ce détail régler, il va falloir répliquer cela sur un tas de Button.
    Et savoir sur quel Button on a cliqué pour récupérer le texte à ajouter à l'Entry.

    C'est pas très compliqué juste la composition de petits riens qu'on apprend dans les tutos.

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

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,



    Un "Button" peut (entre autres) afficher un texte qui, lorsqu'on clique dessus, va déclencher une "action".
    Cette action sera réalisée par une fonction dont le boulot pourra être d'ajouter du texte à une "entry".

    Pour faire çà, un Button, une Entry et une fonction suffisent:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> import tkinter as tk
    >>> root = tk.Tk()
    >>> entry = tk.Entry(root)
    >>> entry.pack()
    >>> def do_action():
    ...    entry.insert('end', 1)
    >>> button = tk.Button(root, text=1, command=do_action)
    >>> button.pack()
    >>> root.mainloop()
    Bien sûr ce détail régler, il va falloir répliquer cela sur un tas de Button.
    Et savoir sur quel Button on a cliqué pour récupérer le texte à ajouter à l'Entry.

    C'est pas très compliqué juste la composition de petits riens qu'on apprend dans les tutos.

    - W
    Bonjour !
    Un grand merci à vous!
    Grâce à votre message et quelques tuto, ça m'a permis de bien avancer dans mon code
    Pour le moment je me creuse la tête pour enfin trouver un moyen de bind le bouton "égale" au résultat. Une fois que j'aurais appris à faire ça, je pourrais définir une fonction pour le binaire, l'hexadecimal puis y bind un autre bouton
    Si j'ai de réel problème, je reviendrais probablement ici étant donné que la date limite de mon travail approche à grand pas.
    edit: Bien sur, il m'affiche une erreur :
    Exception in Tkinter callback
    Traceback (most recent call last):
    File "C:\Python34\lib\tkinter\__init__.py", line 1533, in __call__
    return self.func(*args)
    TypeError: evaluer() missing 1 required positional argument: 'event'

    Voici ce que j'ai pensé faire (ce n'est pas le code entier) :
    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 * 
    from math import *
    import tkinter as tk
     
    #importation de la bibliotheque Tkinter et math
    def evaluer (event):
    	chaine.configure(text = "resultat=" + str(eval(entree.get())))
     
     
    fenetre = Tk()
    fenetre.geometry("400x500") #definis la taille de la fenetre
    fenetre.title ('Calculatrice') #Nom de la fenetre
     
    entree = tk.Entry(fenetre)
    entree.bind("<Return>" , evaluer)#fait en sorte qu'un evenement se produit lorsque l'on appuye sur enter
     
    bouegale = Button(fenetre, text='=', command=evaluer, width =8)
    bouegale.grid(row =7, column =2)
     
    chaine = Label(fenetre)#Modifie l'attribut "texte" lors de l'evenement
     
    entree.grid(row=0, column=1)
    chaine.grid()
    Bonne journée et merci encore.

  10. #10
    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
    Salut,

    C'est parce que votre "callback" evaluer est appelé lorsque l'utilisateur fait
    • <Return>: via le bind, çà recoit un paramètre que vous ignorez dans la fonction,
    • '=': via command=..., dans ce cas, pas de paramètre passé, çà râle.

    Ecrivez juste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #importation de la bibliotheque Tkinter et math
    def evaluer (*event):
    	chaine.configure(text = "resultat=" + str(eval(entree.get())))
    *event dit à l'interpréteur que la fonction reçoit une liste de paramètre éventuellement vide.
    C'est pas très propre, mais c'est "assez bien".

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

  11. #11
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    C'est parce que votre "callback" evaluer est appelé lorsque l'utilisateur fait
    • <Return>: via le bind, çà recoit un paramètre que vous ignorez dans la fonction,
    • '=': via command=..., dans ce cas, pas de paramètre passé, çà râle.

    Ecrivez juste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #importation de la bibliotheque Tkinter et math
    def evaluer (*event):
    	chaine.configure(text = "resultat=" + str(eval(entree.get())))
    *event dit à l'interpréteur que la fonction reçoit une liste de paramètre éventuellement vide.
    C'est pas très propre, mais c'est "assez bien".

    - W
    Bonjour!

    Un grand merci à vous Wiztricks.
    J'ai maintenant une calculatrice basique et fonctionnelle.
    Il ne reste plus que la conversion hexadecimal et binaire..
    Je pense que je vais donc créer un nouveau sujet..

    Merci encore

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

Discussions similaires

  1. Calculatrice simple et programmable?
    Par flyingman dans le forum Autres architectures
    Réponses: 5
    Dernier message: 09/06/2013, 16h18
  2. program calculatrice simple?
    Par delphino7 dans le forum Débuter
    Réponses: 15
    Dernier message: 15/06/2010, 16h19
  3. Problème calculatrice simple
    Par beber54 dans le forum VBA Access
    Réponses: 8
    Dernier message: 23/10/2008, 18h18
  4. Event enable button
    Par jhonnyBravo dans le forum wxPython
    Réponses: 3
    Dernier message: 12/06/2007, 19h33
  5. UserControl : event on click button
    Par breezer911 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 09/03/2007, 09h38

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