8
votes

WXPYTHON: Comment déterminer la source d'un événement

J'ai un panneau avec plusieurs images sur celui-ci, chacune d'entre elles est liée au même gestionnaire d'événements. Comment puis-je déterminer quelle image est en cours de cliquée depuis le gestionnaire d'événements? J'ai essayé d'utiliser Event.GetventObject () mais cela renvoie le panneau parent au lieu de l'image qui a été cliquée.

Voici quelques échantillons de code: P>

import math
import wx

class MyFrame(wx.Frame):

    def __init__(self, parent, id=-1,title="",pos=wx.DefaultPosition,
         size=wx.DefaultSize, style=wx.DEFAULT_FRAME_STYLE,
         name="frame"):

        wx.Frame.__init__(self,parent,id,title,pos,size,style,name)

        self.panel = wx.ScrolledWindow(self,wx.ID_ANY)
        self.panel.SetScrollbars(1,1,1,1)

        num = 4
        cols = 3
        rows = int(math.ceil(num / 3.0))
        sizer = wx.GridSizer(rows=rows,cols=cols)

        filenames = []
        for i in range(num):
            filenames.append("img"+str(i)+".png")
        for fn in filenames:
            img = wx.Image(fn,wx.BITMAP_TYPE_ANY)
            img2 = wx.BitmapFromImage(img)
            img3 = wx.StaticBitmap(self.panel,wx.ID_ANY,img2)
            sizer.Add(img3)
            img3.Bind(wx.EVT_LEFT_DCLICK,self.OnDClick)

        self.panel.SetSizer(sizer)
        self.Fit()

    def OnDClick(self, event):

        print event.GetEventObject() 

if __name__ == "__main__":

    app = wx.PySimpleApp()
    frame = MyFrame(None)
    frame.Show()
    app.MainLoop()


0 commentaires

3 Réponses :


2
votes

appel getid () sur votre événement dans le gestionnaire et comparez l'identifiant, il retourne à l'ID de votre statique. Si vous avez besoin d'un exemple, laissez-moi savoir et mal à mettre à jour ma réponse


4 commentaires

J'ai essayé cela sur le code que j'ai posté ci-dessus en passant un compteur comme argument d'identité au constructeur staticbitmap (0 à N-1). Cependant, appeler getid () sur l'événement renvoie toujours -202, pour une raison quelconque ...


Eh bien, deux façons que vous puissiez le faire créer une liste d'identifiants pour vos images à l'avance (et utilisez-les lors de l'instanciation de vos statiques statiques), puis de les comparer à ... ou mettez vos objets d'image dans une liste, puis pour comparer des identifiants vous peut appeler getid () sur eux aussi, à nouveau si vous voulez un exemple mal ajoutez-le ... il pourrait être plus facile de suivre ..


Désolé, je viens de remarquer que je manque un peu lire votre commentaire. Si vous obtenez -202, cela signifie que vous faites quelque chose de mal. Si vous utilisez réellement le compteur .. Ensuite, vous devriez les obtenir de numéros avec getid () Un identifiant de -202 suggère que votre passe-identification aléatoire


@Johnny Ça fait plus de 3 ans .. J'ai rencontré le même problème .. La solution de Volting pour utiliser getid () me semble préférable pour moi .. Solution de travail affichée dans ma réponse, au cas où vous êtes toujours intéressé;)



6
votes

Dans votre boucle, donnez à chaque widget staticbitmap un nom unique. Une façon de faire cela serait quelque chose comme ceci: xxx pré>

puis incrémenter le compteur à la fin. Ensuite, dans le gestionnaire d'événements, faites quelque chose comme ceci: P>

widget = event.GetEventObject()
print widget.GetName()


0 commentaires

0
votes

Vous pouvez utiliser getid (), mais assurez-vous de le garder unique sur votre programme. Je pose un code modifié pour montrer comment pouvez-vous le faire. Malgré l'utilisation des noms de fichiers comme liste.

def __init__(self, parent, id=-1,title="",pos=wx.DefaultPosition,
     size=wx.DefaultSize, style=wx.DEFAULT_FRAME_STYLE,
     name="frame"):

    wx.Frame.__init__(self,parent,id,title,pos,size,style,name)

    self.panel = wx.ScrolledWindow(self,wx.ID_ANY)
    self.panel.SetScrollbars(1,1,1,1)

    num = 4
    cols = 3
    rows = int(math.ceil(num / 3.0))
    sizer = wx.GridSizer(rows=rows,cols=cols)

    #you should use dict and map all id's to image files
    filenames = []

    for i in range(num):
        filenames.append("img"+str(i)+".png")
    for imgid,fn in enumerate(filenames):
        img = wx.Image(fn,wx.BITMAP_TYPE_ANY)
        img2 = wx.BitmapFromImage(img)

        #pass the imgid here

        img3 = wx.StaticBitmap(self.panel,imgid,img2)
        sizer.Add(img3)
        img3.Bind(wx.EVT_LEFT_DCLICK,self.OnDClick)

    self.panel.SetSizer(sizer)
    self.Fit()

def OnDClick(self, event):

    print 'you clicked img%s'%(event.GetId() )


0 commentaires