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

Python Discussion :

fonction avec arguments après command= dans tkinter


Sujet :

Python

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 9
    Par défaut fonction avec arguments après command= dans tkinter
    Bonjour,

    je voudrai savoir comment insérer une fonction avec des arguments après avoir écrit command= dans la configuration d'un bouton tkinter.

    J'ai un canevas can1 où je souhaite dessiner une ligne. En appuyant sur le bouton bou2 la ligne devrai se dessiner

    voici mon code:
    ---
    def drawline(x1,y1,x2,y2):
    can1.create_line(x1,y1,x2,y2,width=2,fill=coul)
    y2,y1=y2+10,y1-10

    x1, y1, x2, y2=10,190,190,10
    coul="dark green"

    bou2=Button(fen1,text="tracer une ligne", command=drawline)
    ---
    Que mettre après command=drawline ?

    Merci pour votre aide

  2. #2
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Par défaut
    Salut,
    Avec une fonction lambda.


  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 9
    Par défaut
    merci beaucoup dardanos

    j'ai utilisé la fonction lambda mais je n'ai pas réussi entièrement. Encore une petite question.

    voici ce que je mets:

    ---
    def drawline(x1,y1,x2,y2):
    "tracé d'une ligne dans le canevas can1"
    can1.create_line(x1,y1,x2,y2,width=2,fill=coul)
    y2,y1=y2+10,y1-10

    bou2=Button(fen1,text="tracer une ligne", command= lambda x1=10,y1=190,x2=190,y2=10:drawline(x1,y1,x2,y2))
    ---

    j'ai besoin de changer mes variables à chaque fois que j'appuie sur le bouton.
    Comment puis-je faire?
    Est ce qu'on est obligé d'écrire leurs valeurs dans la programmation du bouton?

    merci

  4. #4
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Non, tu n'es pas obligé de fixer des données dans la commande, du moins dans ton exemple.

    Ce n'est d'ailleurs pas une bonne façon de procéder.

    Dans ton cas, je pense que ceci conviendra mieux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    bou2 = Button(fen1, text="tracer une ligne", command=on_button_click)
     
    def on_button_click():
        # Eventuelle mise à jour de x1, y1, x2 et y2
        drawline(x1, y1, x2, y2)
    Ainsi tu ne dois t'occuper que de mettre à jour les coordonnées de ta ligne, par exemple au moyen de global.

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 717
    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 717
    Par défaut
    Salut,
    Dommage de ne pas avoir utilise la balise CODE. Ma première lecture était:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        def drawline(x1,y1,x2,y2):
            can1.create_line(x1,y1,x2,y2,width=2,fill=coul)
            y2,y1=y2+10,y1-10
     
        x1, y1, x2, y2=10,190,190,10
        coul="dark green"
     
        bou2=Button(fen1,text="tracer une ligne", command=drawline)
    Pourquoi passer y1 et y2 en paramètre alors que leurs mises a jour seront perdues?
    Il suffirait d’écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        def drawline():
            global y1, y2
            can1.create_line(x1,y1,x2,y2,width=2,fill=coul)
            y2,y1=y2+10,y1-10
    Pour que çà tombe en marche.
    Mais je ne voyais pas trop le cheminement amenant a passer par des lambdas.

    Le message d'erreur, comme produit par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        >>> def foo():
        ...    a += 1
        ...
        >>> foo()
        Traceback (most recent call last):
          File "<stdin>", line 1, in <module>
          File "<stdin>", line 2, in foo
        UnboundLocalError: local variable 'a' referenced before assignment
    ne dit pas: "ajouter 'a' comme paramètre a la fonction".
    Ce message d'erreur dit "attention! monsieur le programmeur, vous voulez modifier une variable dont le nom est inconnu".

    Par défaut, une fonction appelée avec les mêmes paramètres d’entrées doit produire le même résultat (ou plutôt les mêmes effets). Tout autre mode de fonctionnement doit être explicitement traité par le programmeur - ici, en écrivant global y1, y2.

    Cette règle n'est pas particulière a Python. Programmer n'est possible qu'avec des comportements de base prévisibles, stables,... Après tout, si 2 + 2 retourne autre chose que 4: quelque chose ne vas pas. Comment choisir entre remplacer l'ordinateur ou virer le programmeur (oops, c'est vous!)?

    - W
    PS: Ici ou la vous lirez la recommandation "dans une fonction, ne pas utiliser de variables globales". Plus juste serait "par défaut, une fonction ne doit pas modifier l’état global". Et un bon langage de programmation permet de le vérifier rapidement.
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 9
    Par défaut
    Merci beaucoup pour vos réponses

    Le problème est que je fais un exercice d'entrainement. Le code que vous m'avez écrit, je l'avais déjà au début mais on m'a demandé de faire passer x1,y1,x2,y2 en parametre de la fonction drawline

    Merci si vous pouvez m'aider

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 717
    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 717
    Par défaut
    Citation Envoyé par dg1312 Voir le message
    Le problème est que je fais un exercice d’entraînement. Le code que vous m'avez écrit, je l'avais déjà au début mais on m'a demandé de faire passer x1,y1,x2,y2 en paramètre de la fonction drawline
    Vous avez deja realise la partie passage de parametre avec lambda: relisez votre post
    Vous avez aussi constate:
    j'ai besoin de changer mes variables à chaque fois que j'appuie sur le bouton. Comment puis-je faire?
    Si drawline était fonction, le boulot serait fait. Le soucis est que drawline est une action qui crée une line a la position (x1, y1, x2, y2) et met a jour y1, y2 pour créer une line plus grande a l'appel suivant.
    Le lambda fabrique une fonction a partir d'autre en permettant de geler certains paramètres d'appels, si on le deplie, ca donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
       def drawline(x1,y1,x2,y2):
            def doit():
                nonlocal y1, y2
                can1.create_line(x1,y1,x2,y2,width=2,fill=coul)
                y2,y1=y2+10,y1-10
            return doit
     
        x1, y1, x2, y2=10,190,190,10
        coul="dark green"
     
        bou2=Button(fen1,text="tracer une ligne", command=drawline(x1, y1, x2, y2))
    drawline est une fonction qui retourne une fonction emboitee - nested - (un peu comme le lambda). Elle pourra utiliser et modifier les paramètres passes.
    Le problème est que je fais un exercice d'entrainement. Le code que vous m'avez écrit, je l'avais déjà au début mais on m'a demandé de faire passer x1,y1,x2,y2 en parametre de la fonction drawline
    Sans connaître le but pédagogique de l'exercice, pas évident que cette construction soit acceptable: si vous avez appris a construire des class, il serait plus sage de les utiliser ici.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,
    Je ne comprend pas que l'on te demande d'inclure les arguments dans la commande et en même temps de modifier ces arguments après coup.

    Ta lambda n'est pas recréée à chaque pression du bouton.

    exemple:
    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 drawline(args):
        global values
        x1, y1, x2, y2 = args
        print x1, y1, x2, y2
        values = (x1, y1, y2+10, y1-10)
     
    values = (10, 190, 190, 10)
     
    fen = Tk()
    bout = Button(fen,text="line", command= lambda x=values:drawline(x))
    bout.pack(padx =20, pady =20)
    fen.mainloop()

  9. #9
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 717
    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 717
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Je ne comprend pas que l'on te demande d'inclure les arguments dans la commande et en même temps de modifier ces arguments après coup.
    Si la personne est un enseignant, le but de la demande est peut être de forcer le PO a faire une gymnastique intellectuelle sur globals/locals et la difference entre fonction et action (ou objet).
    L’intérêt n’est plus le but mais le voyage.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 9
    Par défaut
    Merci beaucoup tout le monde

Discussions similaires

  1. recuperer une fonction avec arguments dans une dll
    Par freuh94 dans le forum Windows
    Réponses: 3
    Dernier message: 03/10/2009, 11h45
  2. Création fonction avec argument dans une classe
    Par Général03 dans le forum Windows Forms
    Réponses: 8
    Dernier message: 30/06/2009, 09h57
  3. onChange et fonction avec arguments
    Par pierre.egaud dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 13/06/2006, 11h02
  4. DLL export de fonction avec argument
    Par slate dans le forum C
    Réponses: 3
    Dernier message: 31/05/2006, 10h36
  5. creer une fonction avec arguments
    Par niglo dans le forum ASP
    Réponses: 3
    Dernier message: 03/06/2005, 08h04

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