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

wxPython Discussion :

Méthode Bind sur quoi


Sujet :

wxPython

  1. #1
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 39
    Par défaut Méthode Bind sur quoi
    Bonjour ,

    Je n'arrive pas trop à comprendre ce qu'il faut mettre à gauche de: .Bind(wx.EVT_***, UneFonction, unwidget)

    C'est la notion de handler (pas facile à traduire d'ailleurs) dans le livre de
    Rappin.

    C'est ce code là qui m'a interpellé:
    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
     
    import wx
     
    class DoubleEventFrame(wx.Frame):
     
        def __init__(self, parent, id):
            wx.Frame.__init__(self, parent, id, 'Frame With Button',
                    size=(300, 100))
            self.panel = wx.Panel(self, -1)
            self.button = wx.Button(self.panel, -1, "Click Me", pos=(100, 15))
            self.Bind(wx.EVT_BUTTON, self.OnButtonClick, self.button)
            self.button.Bind(wx.EVT_LEFT_DOWN, self.OnMouseDown)
     
        def OnButtonClick(self, event):
            self.panel.SetBackgroundColour('Green')
            self.panel.Refresh()
     
        def OnMouseDown(self, event):
            self.button.SetLabel("Again!")
            event.Skip()
     
    if __name__ == '__main__':
        app = wx.PySimpleApp()
        frame = DoubleEventFrame(parent=None, id=-1)
        frame.Show()
        app.MainLoop()
    Je comprends que dans self.Bind(...) on applique la méthode à une
    instance de DoubleEventFrame (notre fenetre principale).

    Dans self.button.Bind(...) c'est à self.button une instance de wx.Button (notre bouton) qu'on applique la méthode Bind.

    Comment choisir quelle est le bon objet sur lequel il faut appliquer la méthode
    Bind? Je crois que c'est la bonne question?

    Merci

  2. #2
    Membre expérimenté
    Avatar de Alain_72
    Inscrit en
    Août 2004
    Messages
    180
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 180
    Par défaut
    Tout dépend à quel niveau tu veux récupérer ton évènement.

    Dans l'exemple, le Bind sur le bouton (wx.EVT_LEFT_DOWN) est récupéré en premier, puisqu'il se situe directement au niveau du contrôle concerné.
    Le Bind sur la Frame (wx.EVT_BUTTON) récupère l'évènement par propagation. Comme ça se fait indirectement, il faut fournir à la méthode le contrôle concerné.

    Si tu commentes le event.Skip() de la méthode OnMouseDown(), tu constateras que c'est bien le même évènement que tu récupéres dans les deux méthodes, car en ne le libérant pas, il n'est plus récupéré au niveau de la frame dont le fond ne passe plus au vert.

  3. #3
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 39
    Par défaut
    Citation Envoyé par Alain_72
    Tout dépend à quel niveau tu veux récupérer ton évènement.

    Dans l'exemple, le Bind sur le bouton (wx.EVT_LEFT_DOWN) est récupéré en premier, puisqu'il se situe directement au niveau du contrôle concerné.
    Le Bind sur la Frame (wx.EVT_BUTTON) récupère l'évènement par propagation. Comme ça se fait indirectement, il faut fournir à la méthode le contrôle concerné.

    Si tu commentes le event.Skip() de la méthode OnMouseDown(), tu constateras que c'est bien le même évènement que tu récupéres dans les deux méthodes, car en ne le libérant pas, il n'est plus récupéré au niveau de la frame dont le fond ne passe plus au vert.
    Désolé mais meme tous ces efforts d'explication ni font rien je ne comprends
    pas tout.

    Voyons ce que j'ai compris. Prenons le cas du bouton.

    Quand il se passe quelque chose au niveau du bouton (pe clic de souri, passage de la souri) ça déclenche un event wx.EVT_BUTTON . C'est exact?
    Cet évenement se propage, bon j'accepte la notion de propagation, j'y revendrais.

    On peut être plus précis sur le "quelque chose". Si je clique gauche souri
    sur le bouton je déclenche un event wx.EVT_LEFT_DOWN. C'est ça.

    Et si je clique gauche souri ailleurs (barre de menu pe) je déclenche wx.EVT_LEFT_DOWN aussi non. Oui?

    C'est pour ça que l'on
    met .Bind(wx.EVT_***,[...], unwidget). C'est ça?

    Non ça doit pas être ça car le "unwidget" dépend de l'endroit ou on veut récupérer l'évenement.

    Si j'ai bien compris on n'a pas besoin de "unwidget" si le bind se fait sur "un widget". C'est ça?

    Mais quel est l'intérêt de la propagation?
    Je n'aurai pas pu écrire dans l'exemple:

    self.Bind(wx.EVT_LEFT_DOWN, self.OnButtonClick, self.button)
    au lieu de: self.button.Bind(wx.EVT_LEFT_DOWN, self.OnMouseDown)

    Pourquoi faire le .Bind sur la frame?


    Merci







    Merci

  4. #4
    Membre expérimenté
    Avatar de Alain_72
    Inscrit en
    Août 2004
    Messages
    180
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 180
    Par défaut
    Non, tu n'aurais pas pu écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.Bind(wx.EVT_LEFT_DOWN, self.OnButtonClick, self.button)
    Car le but de la manoeuvre est de traiter séparément le click sur le bouton et l'appui sur le bouton gauche sur le bouton.

    L'évènement renvoyé par la macro wx.EVT_BUTTON() est un clic gauche, soit l'appui puis le relachement du bouton (c'est le seul évènement intercepté par cette macro).

    Celui renvoyé par la macro wx.EVT_LEFT_DOWN() est un appui sur le bouton gauche.

    Si un Bind sur le même bouton et au même niveau d'interception pointe à la fois sur le clic et l'appui gauche, seul le clic est renvoyé.

  5. #5
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 39
    Par défaut bouton et bouton...j'ai fait tilt
    Pour essayer de comprendre je vais substituer widget à bouton et laisser bouton quand il s'agit du bouton de la souri, si tu me le permets, Alain_72. En rouge sont mes modifs
    Citation Envoyé par Alain_72
    Car le but de la manoeuvre est de traiter séparément le click sur le bouton et l'appui sur le bouton gauche sur le bouton.
    Car le but de la manoeuvre est de traiter différemment le clic sur le widget et l'appui sur le bouton gauche de la souri sur le widget.

    Citation Envoyé par Alain_72
    L'évènement renvoyé par la macro wx.EVT_BUTTON() est un clic gauche, soit l'appui puis le relachement du bouton (c'est le seul évènement intercepté par cette macro).
    Celui renvoyé par la macro wx.EVT_LEFT_DOWN() est un appui sur le bouton gauche.
    L'évènement renvoyé par la macro wx.EVT_BUTTON() est un clic gauche du bouton de la souri , soit l'appui puis le relachement du widget (c'est le seul évènement intercepté par cette macro).
    Celui renvoyé par la macro wx.EVT_LEFT_DOWN() est un appui sur le bouton gauche de la souri.

    Citation Envoyé par Alain_72
    Si un Bind sur le même bouton et au même niveau d'interception pointe à la fois sur le clic et l'appui gauche, seul le clic est renvoyé.
    Si un Bind sur le même widget et au même niveau d'interception pointe à la fois sur le clic sur le widget et l'appui gauche sur le bouton de la souri,seul le clic est renvoyé.

    Bon c'est cela ?

    Est-ce normal que je pataugeasse à ce point sur les événements?
    C'est dommage parce que c'est très important.
    Je vais digérer tout ça et essayer de pratiquer.

    Merci

Discussions similaires

  1. [Débutant] WPF : Binding sur une méthode
    Par TWEESTY dans le forum C#
    Réponses: 2
    Dernier message: 16/12/2012, 11h02
  2. Warning avec la méthode "clone" sur un "ArrayList"
    Par Pragmateek dans le forum Collection et Stream
    Réponses: 10
    Dernier message: 04/07/2006, 11h28
  3. Réponses: 8
    Dernier message: 19/06/2006, 15h31
  4. [Javascript][Firefox] méthode click() sur une balise A
    Par jothi35 dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 17/02/2006, 14h36

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