wxPython:如何确定事件的来源

8 投票
3 回答
5565 浏览
提问于 2025-04-16 02:20

我有一个面板,上面放了好几张图片,每张图片都绑定了同一个事件处理器。请问我该如何从事件处理器中判断是哪个图片被点击了呢?我试过用 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()

3 个回答

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,这样你就可以在整个程序中跟踪它们。

2

在你的事件处理程序中调用 GetId(),然后把它返回的id和你的静态位图的id进行比较。如果你需要示例的话,告诉我,我会更新我的回答。

6

在你的循环中,给每个StaticBitmap小部件起一个独特的名字。你可以这样做:

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

然后在最后把计数器加一。接着在事件处理函数里,可以这样做:

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

这样的方法对我一直有效。

撰写回答