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 :

Méthode appelée lors de la création du bouton et non sur clic [Python 3.X]


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Autodidacte débutant
    Inscrit en
    Mai 2016
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Autodidacte débutant

    Informations forums :
    Inscription : Mai 2016
    Messages : 55
    Par défaut Méthode appelée lors de la création du bouton et non sur clic
    Bonjour,

    Je découvre python et tkinter.
    J’essaye de créer une application de gestion de devoirs pour un professeur.
    A un moment du code, je créé des boutons correspondant aux classes qu’a ce professeur grâce à une boucle for.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def creationBoutonClasse():
                    listeClasse = mesCoursClasses.MesClasses.chargerClasse()
                    nbClasse = -1
     
                    if listeClasse == []:
                        self.bouton_no_classe = tkinter.Button(self.frame_saisie_bouton_classe, text = "Vous n'avez pas encore créé de classe ! Cliquez ici pour le faire.")
                        self.bouton_no_classe.bind('<Button-1>', affichageFrameGestion)
                        self.bouton_no_classe.grid(row=0, column=0, pady=5, padx=5)
                    else:
                        for item in listeClasse:
                            nbClasse += 1
                            self.nouveau_Bouton = tkinter.Button(self.frame_saisie_bouton_classe, text = item.nomClasse, background = item.couleurClasse, height = 3, width=6, command=classeDevoir(item))                        
                            self.nouveau_Bouton.grid(row=0, column=nbClasse, pady=5, padx=5)
    Les boutons ont une couleur de background qui correspond à la couleur choisit par le professeur pour cette classe. (Exemple pour les 6eme il aura choisi le rouge)
    Ces boutons apparaissent et ont même la couleur de fond qui correspond à la classe.
    Par contre, il faut que, lors d’un clic sur ces boutons, quelque chose se passe.
    Si je mets dans la boucle qui créée les boutons « command = classeDevoir(item)»
    Et bien le code appelle cette méthode dès qu’il créé le bouton.
    Alors que moi j’aimerai que cette méthode ne soit appelée que sur le clic.
    J’ai essayé toujours dans cette boucle d’utiliser plutôt un self.nouveauBouton.bind(‘<button-1>’, classeDevoir(item))
    Mais même résultat, la méthode est appelée lors de la création du bouton et pas lors d’un clic.

    La méthode classeDevoir(item) est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def classeDevoir(item):
                    self.frame_saisie_devoir.config(text = "Votre devoir pour les " + item.nomClasse, background = item.couleurClasse)
    J’ai essayé de gérer le clic en dehors de la boucle mais je ne sais pas comment récupérer les boutons créés dedans.
    Et même de cette manière comment les différenciés puisqu’ils ont le même nom ?

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,

    Citation Envoyé par Ledidic Voir le message
    Par contre, il faut que, lors d’un clic sur ces boutons, quelque chose se passe.
    Si je mets dans la boucle qui créée les boutons « command = classeDevoir(item)»
    Et bien le code appelle cette méthode dès qu’il créé le bouton.
    Avec Python classeDevoir(item) appelle la fonction classeDevoir avec item pour paramètre. Par contre, si classeDevoir était une méthode de l'item, vous pourriez passer item.classeDevoir en paramètre.

    Mais vous pouvez aussi utiliser des fermetures/closures mais avant il va falloir lire un petit tuto sur le sujet.

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

  3. #3
    Membre actif
    Homme Profil pro
    Autodidacte débutant
    Inscrit en
    Mai 2016
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Autodidacte débutant

    Informations forums :
    Inscription : Mai 2016
    Messages : 55
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,



    Avec Python classeDevoir(item) appelle la fonction classeDevoir avec item pour paramètre. Par contre, si classeDevoir était une méthode de l'item, vous pourriez passer item.classeDevoir en paramètre.

    Mais vous pouvez aussi utiliser des fermetures/closures mais avant il va falloir lire un petit tuto sur le sujet.

    - W
    Et bien merci beaucoup pour les tuyaux.
    J'ai utilisé lambda qui fait parfaitement le job.
    Je vais bosser d'avantage les "fermetures" qui me paraissent plus obscures.

    Merci encore wiztricks et bonne fin de soirée

  4. #4
    Membre actif
    Homme Profil pro
    Autodidacte débutant
    Inscrit en
    Mai 2016
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Autodidacte débutant

    Informations forums :
    Inscription : Mai 2016
    Messages : 55
    Par défaut
    Bon finalement je me suis peut être emballé trop vite.
    J'ai fais mon test avec seulement un bouton.

    Le code qui est censé se lancer au clic se lance en effet sur un clic et plus à la création du widget. (ça c'est cool)
    En revanche si j'ai plus de un bouton quand je clic sur n'importe lequel d'entre eux c'est la couleur du dernier bouton créé qui est affecté à ma frame (ça c'est moins cool)

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Citation Envoyé par Ledidic Voir le message
    En revanche si j'ai plus de un bouton quand je clic sur n'importe lequel d'entre eux c'est la couleur du dernier bouton créé qui est affecté à ma frame (ça c'est moins cool)
    Avez vous pris le temps de lire le tuto. sur les fermetures/closures? A priori, on y explique pourquoi et comment créer les closures avec lambda dans une boucle.

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

  6. #6
    Membre actif
    Homme Profil pro
    Autodidacte débutant
    Inscrit en
    Mai 2016
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Autodidacte débutant

    Informations forums :
    Inscription : Mai 2016
    Messages : 55
    Par défaut
    Et bien j'ai lu en diagonale quand vous m'en avez parlé mais je ne voyais pas comment cela allez résoudre mon soucis.
    Je viens d'utiliser les fermetures est mon problème est résolu avec un et plusieurs boutons.
    Mais je ne comprend toujours pas pourquoi.
    Je vais encore tenter de comprendre le tuto.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 13/01/2012, 14h02
  2. Réponses: 0
    Dernier message: 09/02/2009, 17h55
  3. erreur lors de la création d'un album photo sur le web
    Par lapoisse dans le forum Dreamweaver
    Réponses: 3
    Dernier message: 02/07/2007, 10h24
  4. Réponses: 1
    Dernier message: 10/05/2006, 22h07
  5. [JPanel] quel méthode appelé lors du rafraichissement...
    Par lilou77 dans le forum Interfaces Graphiques en Java
    Réponses: 5
    Dernier message: 01/11/2005, 15h08

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