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 :

Exécution fonction sans clic sur bouton


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2011
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 20
    Par défaut Exécution fonction sans clic sur bouton
    Bonjour.
    Je débute en python en suivant le cours proposé sur Developpez.com. Je rencontre un souci lors d'un exercice, où il faut que le clic sur un bouton affiche un anneau. Il il a un bouton par anneau.
    Mon probème est le suivant : lorsque je lance le script, tout les anneaux sont déja dessinés, sans que j'aie cliqué sur un bouton.
    Quelle est mon erreur?
    Voici le 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
    #!/usr/bin/env python
    # -*- coding:Utf-8 -*- 
    # Fichier: olymp.py
    # Cree le 17 janv. 2011 20:56:24
    # Derniere modification: 17 janv. 2011 20:56:24
     
    from Tkinter import *
     
    def cercle(x, y, r, col):
        can1.create_oval(x-r, y-r, x+r, y+r, outline=col)
     
    pal = ['cyan', 'green', 'yellow', 'red', 'black']   # la palette de couleurs
    x, y = 50, 100                                      # Positions de départ des anneaux
    r = 20                                              # rayon d'un anneau
     
    fen1 = Tk()
    can1 = Canvas(fen1, bg='white', height=200, width=400)
    can1.pack(side=LEFT)
     
    bou1 = Button(fen1, text='Anneau 1', command=cercle(x, y, r, pal[0]))       
    bou2 = Button(fen1, text='Anneau 2', command=cercle(x+25, y, r, pal[1]))
    bou3 = Button(fen1, text='Anneau  3', command=cercle(x+50, y, r, pal[2]))
    bou4 = Button(fen1, text='Anneau  4', command=cercle(x+75, y, r, pal[3]))
    bou5 = Button(fen1, text='Anneau 5', command=cercle(x+100, y, r, pal[4]))
    bou6 = Button(fen1, text='quitter', command=fen1.quit)
    bou1.pack()
    bou2.pack()
    bou3.pack()
    bou4.pack()
    bou5.pack()
    bou6.pack()
     
    fen1.mainloop()
     
    fen1.destroy()
    Merci d'avance

  2. #2
    Membre très actif
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Par défaut
    Bonjour,
    Je pense que ton erreur se situe a ce niveau:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    bou1 = Button(fen1, text='Anneau 1', command=cercle(x, y, r, pal[0]))       
    bou2 = Button(fen1, text='Anneau 2', command=cercle(x+25, y, r, pal[1]))
    bou3 = Button(fen1, text='Anneau  3', command=cercle(x+50, y, r, pal[2]))
    bou4 = Button(fen1, text='Anneau  4', command=cercle(x+75, y, r, pal[3]))
    bou5 = Button(fen1, text='Anneau 5', command=cercle(x+100, y, r, pal[4]))
    Tu appel a chaque fois la methode cercle. Tu devrais essayer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bou2 = Button(fen1, text='Anneau 2', command = lambda :cercle(x+25, y, r, pal[1]))
    bref tu dois te servir de lambdas.
    Ou definir a chaque fois la methode pour chaque appel, bien que un peu fastidieux.
    Win 10 64 bits / Linux Mint 18, - AMD A6 Quad: Py27 / Py35
    CONTENU D'UNE QUESTION
    Exemples:
    - Configuration (système d'exploitation, version de Python et des bibliothèques utilisées)
    - Code source du morceau de programme où il y a un bogue
    - Ligne de code sur laquelle le bogue apparaît
    - Erreur complète retournée pas l'interpréteur Python
    - Recherche déjà effectuée (FAQ, Tutoriels, ...)
    - Tests déjà effectués

  3. #3
    Membre averti
    Inscrit en
    Janvier 2011
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 20
    Par défaut
    Merci de ta réponse. Ça fonctionne en effet
    Je pensais que la commande ne serait éxécutée que au clic. la méthode lambda fais quoi exactement en fait? Je ne comprend pas pourquoi c'est exécuté au clic maintenant que lambda est utilisé.

  4. #4
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Salut,

    Citation Envoyé par Thuban Voir le message
    Je ne comprend pas pourquoi c'est exécuté au clic maintenant que lambda est utilisé.
    Supposons que tu aies créé une fonction toto.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bou1 = Button(fen1, text='Anneau 1', command=toto)
    Là, python a compris que command est un pointeur sur toto

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bou1 = Button(fen1, text='Anneau 1', command=toto())
    Là, par contre, l'interpreteur lance toto pour affecter le résultat à command. Considère lambda comme un pointeur vers une fonction avec paramètre(s).

  5. #5
    Membre averti
    Inscrit en
    Janvier 2011
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 20
    Par défaut
    Merci pour tous les éclaircissements. Je suppose que le sujet de lambda sera abordé un peu plus loin dans le cour de toute façon .
    Merci!

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

Discussions similaires

  1. Réponses: 17
    Dernier message: 04/05/2014, 19h08
  2. RequiredFieldValidator validé sans clic sur bouton
    Par xian21 dans le forum Développement Web avec .NET
    Réponses: 8
    Dernier message: 06/05/2010, 16h01
  3. Réponses: 4
    Dernier message: 29/04/2010, 06h30
  4. Simuler clic sur bouton image sans nom
    Par andrebernard dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 11/03/2009, 14h00

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