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 :

une methode qui se lance sans que je le veuille


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2013
    Messages : 38
    Par défaut une methode qui se lance sans que je le veuille
    Le code présenté plus bas lance une transformation d'une image ( la fonction de transformation est codée dans un autre fichier py que j'importe, elle renvoie un objet image de la librairie PIL).
    Normalement la fonction de transformation de l'image ne se lance que par un appui sur le bouton. Or, dès la première éxécution, la transformation est réalisée. De plus, elle ne se réalise pas une seocnde fois lors de l'appui sur le bouton ( ce qui était attendu)
    Merci d'avance pour vos lumières.

    Le code:

    from Fonctions_Photomaton import *
    from PIL import Image, ImageTk
    import Tkinter as Tk

    class ImagePhotomaton():
    def __init__(self,chem,can):
    self.chemin=chem
    self.canvas=can
    self.image_affichee=Image.open(chem)


    def afficher_Image(self):

    self.photo=ImageTk.PhotoImage(self.image_affichee)
    self.canvas.create_image(0,0,anchor=Tk.NW,image=self.photo)
    self.canvas.itemconfigure(self.photo,image=self.image_affichee)


    def Transforme_et_Affiche(self):
    self.image_affichee=TransformePhotomaton(self.image_affichee)
    self.afficher_Image()

    fen=Tk.Tk()
    can = Tk.Canvas(fen, width=512, height=512)
    im=ImagePhotomaton("image7.jpg",can)
    im.afficher_Image()
    bouton_de_transformation_simple= Tk.Button(fen,text="transformer",command=im.Transforme_et_Affiche())
    can.pack()
    bouton_de_transformation_simple.pack()
    fen.mainloop()

  2. #2
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2013
    Messages : 38
    Par défaut je me réponds à moi-même en partie
    dans les méthodes appelées par les commandes des boutons, il faut supprimer les parenthèses ou écrire lambda: devant la méthode.
    J'arrive à faire fonctionner mais je n'ai pas le sentiment de bien comprendre.

  3. #3
    Membre Expert 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
    Par défaut
    Bonjour,

    Lors de la création du Widget la fonction qui succède command= est stockée pour être appelée/interprétée lors de l’événement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> import tkinter as tk
    >>> root = tk.Tk()
    >>> b = tk.Button(root, command=lambda: False)
    >>> b._tclCommands
    ['170681964<lambda>']
    Si vous terminez cette commande par () celle ci est interprétée lors de la création et c'est son retour qui est stocké.
    Si vous ne spécifiez pas un return explicite à votre fonction celle ci retourne None par défaut.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> b = tk.Button(root, command=None)
    >>> b._tclCommands
    []
    Lorsque vous utilisez lambda la fonction lambda est stockée et lors de son exécution elle évalue la fonction qu'elle 'contient'.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> b = tk.Button(root, command=lambda: sys.exit())
    >>> b._tclCommands
    ['170636396<lambda>']
    Tout ceci n'est utile que si vous voulez passer des arguments à votre callback (exemple : command=sys.exit(1)) et ici vous n'avez qu'à ne pas mettre les parenthèses pour que votre fonction ne soit interprétée que lors de l'event.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bouton_de_transformation_simple= Tk.Button(fen,text="transformer",command=im.Transforme_et_Affiche)
    @+

  4. #4
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2013
    Messages : 38
    Par défaut
    merci pour votre réponse.
    Je comprends comment cela marche
    Je vais essayer de me documenter sur les fonctions call-back pour comprendre pourquoi cela marche ainsi.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/03/2010, 07h07
  2. Réponses: 3
    Dernier message: 30/03/2008, 21h50
  3. Réponses: 3
    Dernier message: 13/07/2006, 17h56
  4. Réponses: 5
    Dernier message: 10/05/2006, 09h10
  5. appel d'une methode qui ne marche pas
    Par hansaplast dans le forum C++
    Réponses: 4
    Dernier message: 27/04/2006, 13h52

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