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()
3 Réponses :
appel getid () code> 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 p>
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é;)
Dans votre boucle, donnez à chaque widget staticbitmap un nom unique. Une façon de faire cela serait quelque chose comme ceci: 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()
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() )