2010-08-04 28 views
6

我有一个面板上有几个图像,每个图像绑定到相同的事件处理程序。我如何确定从事件处理程序中点击哪个图像?我尝试使用Event.GetEventObject(),但它返回父面板,而不是单击的图像。wxPython:如何确定事件源

下面是一些示例代码:

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() 

回答

1

呼叫GetId()在处理程序的事件,并比较其返回到您的staticBitmaps的ID标识。如果你需要一个例子让我知道,我会更新我的答案

+0

我在上面发布的代码上通过将一个计数器作为id参数传递给staticBitmap构造函数(0到n-1)来试用此功能。然而,对事件调用GetId()总是返回-202,由于某种原因... – Johnny 2010-08-05 00:05:17

+0

那么你可以这样做的两种方式预先为你的图像创建一个Id列表(并在实例化你的staticBitmaps时使用它们),然后只是比较它们......或者将你的图像对象放入一个列表中,然后比较那些Ids,你也可以在它们上面调用GetId(),如果你想要一个例子,我们再添加它......它可能更容易遵循。 – volting 2010-08-05 00:12:12

+0

对不起,我只是注意到,我有点想念你的评论。如果你得到-202这意味着你做错了什么..如果你真的使用计数器..那么你应该得到他们的数字返回与GetId()ID为-202表明你通过随机Id – volting 2010-08-05 00:36:53

4

在你的循环中,给每个StaticBitmap小部件一个唯一的名称。一种方法是这样的:

wx.StaticBitmap(self, wx.ID_ANY, 
       wx.BitmapFromImage(img), 
       name="bitmap%s" % counter) 

然后在最后增加计数器。然后在事件处理程序中,执行如下操作:

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

这对我而言一直都很有用。

0

您可以使用GetId(),但请确保在程序中保持唯一性。我张贴修改后的代码来展示你如何做到这一点。尽管使用文件名作为列表。

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()) 

您可以使用字典和每个文件名映射到ID,通过这种方式,通过您的PROGRAME你会跟踪这一切。