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 :

Passage d'arguments à une fonction après clic sur un bouton


Sujet :

Tkinter Python

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 51
    Points : 34
    Points
    34
    Par défaut Passage d'arguments à une fonction après clic sur un bouton
    Salut,

    J'ai fais un bout de code simple pour illustrer ce que je veux faire. Je créé un bouton, je veux passer la valeur d'une variable dès que je clique sur le bouton. Dans l'exemple de code ci dessous, la valeur de la variable nb_volume ne doit s'afficher que quand l'utilisateur clique sur le bouton. Hors, dans ce cas, le programme exécute la fonction dès le lancement du programme puisque qu'il affiche la valeur de la variable.
    Comment faire pour lui communiquer la variable nb_volume et que la fonction afficher ne se déclenche que lorsque l'utilisateur clique sur le bouton?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    from Tkinter import *
     
    def afficher(nb_volume):
        print str(nb_volume)
     
    fen=Tk()
     
    nb_volume=20
    bouton1=Button(fen,text='Salut',command=afficher(nb_volume))
    bouton1.pack()
     
    fen.mainloop()
    Merci pour votre aide

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    re bonjour,

    un peu de lecture:

    http://effbot.org/zone/tkinter-callbacks.htm

  3. #3
    Expert confirmé 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
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Et plus tordu (je pense que la réponse de kango est largement suffisante mais cela manque sur effbot) :

    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 *
     
    def afficher():
        print nb_volume.get()
     
    fen=Tk()
     
    nb_volume=IntVar()
    nb_volume.set(20)
     
    Button(fen,text='Salut',command=afficher).pack()
     
    fen.mainloop()
    @+
    Merci d'utiliser le forum pour les questions techniques.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 51
    Points : 34
    Points
    34
    Par défaut Merci
    Merci pausekawa, j'ai utilisé ton astuce, j'ai pu l'adapter à mon programme et a marche bien.

    A bientôt

  5. #5
    Expert confirmé 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
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Je n'ai fais que rajouter une info au lien de kango.

    Il serait plus sage d'utiliser son lien car dans mon cas j'utilise la closure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    from Tkinter import *
     
    def afficher(nb_volume):
        print str(nb_volume)
     
    fen=Tk()
     
    nb_volume=20
    Button(fen, text='Salut',command=lambda: afficher(nb_volume)).pack()
     
    fen.mainloop()
    @+

    Edit :

    Petite explication quand même.

    Dans le cadre de mon code nb_volume est visible pour afficher()
    De même tu aurais pu faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    from Tkinter import *
     
    def afficher():
        print str(nb_volume)
     
    fen=Tk()
     
    nb_volume=20
    Button(fen,text='Salut',command=afficher).pack()
     
    fen.mainloop()
    C'est cela la closure.

    Attention toutefois : Les variables (et autres) d'afficher() ne le sont 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
    from Tkinter import *
     
    def afficher():
        nouveau = nb_volume + 20
        print nouveau
     
    fen=Tk()
     
    nb_volume=20
    Button(fen,text='Salut',command=afficher).pack()
     
    fen.mainloop()
     
    print nb_volume
    print nouveau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    40
    20
    Traceback (most recent call last):
      File "tab.py", line 15, in <module>
        print nouveau
    NameError: name 'nouveau' is not defined
    Pour ce qui concerne lambda :

    Dans ton code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    from Tkinter import *
     
    def afficher(nb_volume):
        print str(nb_volume)
     
    fen=Tk()
     
    nb_volume=20
    Button(fen, text='Salut',command=afficher(nb_volume)).pack()
     
    fen.mainloop()
    Tu donne ta variable à afficher() donc command l'exécute des la création du Button.
    lambda crée une fonction* donc si tu l'utilise avec command c'est comme tu faisait command=unefonction et ne l'exécute que lors de l'event du widget.

    * Note : Cela peux aussi être une procédure, ce qui est ton cas puisque afficher ne retourne rien (return). C'est toujours une procédure/fonction 'simple'.

    Tu retrouve un sujet dessus ici

    @+
    Merci d'utiliser le forum pour les questions techniques.

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

Discussions similaires

  1. Passage d'argument à une fonction
    Par free_01_binairy dans le forum Général JavaScript
    Réponses: 44
    Dernier message: 25/11/2014, 19h07
  2. changer la couleur d'une cellule après clic sur case à cocher
    Par zozoman dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 04/07/2013, 11h49
  3. [XL-2003] insertion d'une fonction apres clique sur bouton
    Par moxo01 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 10/04/2009, 15h36
  4. [HTML] affichage d'une page après clic sur le bouton 'précédent' du navigateur
    Par val_lala dans le forum Balisage (X)HTML et validation W3C
    Réponses: 11
    Dernier message: 06/04/2008, 23h21
  5. [JAVASCRIPT] passage d'argument à une fonction
    Par LE NEINDRE dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 03/06/2005, 18h17

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