我有一个Panel上有几个图像,每个图像都绑定到同一个事件处理程序。如何确定从事件处理程序中单击哪个图像?我尝试使用Event.GetEventObject()但它返回父面板而不是单击的图像。
以下是一些示例代码:
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 :(得分:4)
在循环中,为每个StaticBitmap小部件指定一个唯一的名称。一种方法是这样的:
wx.StaticBitmap(self, wx.ID_ANY,
wx.BitmapFromImage(img),
name="bitmap%s" % counter)
然后在最后增加计数器。然后在事件处理程序中,执行以下操作:
widget = event.GetEventObject()
print widget.GetName()
这对我来说总是有用的。
答案 1 :(得分:1)
在处理程序中对事件调用GetId()
,并将它返回的id与staticBitmaps的id进行比较。如果你需要一个例子让我知道并且我会更新我的答案
答案 2 :(得分: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() )
您可以使用dict并将每个文件名映射到id,通过这种方式,您将通过您的程序跟踪它。