获取触发事件的按钮名称的最佳方法?

4 投票
7 回答
13722 浏览
提问于 2025-04-15 12:09

在下面的代码中(灵感来源于这个代码片段),我使用了一个事件处理器buttonClick来改变窗口的标题。目前,我需要判断事件的Id是否和按钮的Id对应。如果我决定添加50个按钮,而不是2个,这种方法可能会变得很麻烦。有没有更好的方法来处理这个问题呢?

import wx

class MyFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, 'wxBitmapButton',
            pos=(300, 150), size=(300, 350))
        self.panel1 = wx.Panel(self, -1)

        self.button1 = wx.Button(self.panel1, id=-1,
            pos=(10, 20), size = (20,20))
        self.button1.Bind(wx.EVT_BUTTON, self.buttonClick)

        self.button2 = wx.Button(self.panel1, id=-1,
            pos=(40, 20), size = (20,20))
        self.button2.Bind(wx.EVT_BUTTON, self.buttonClick)

        self.Show(True)

    def buttonClick(self,event):
        if event.Id == self.button1.Id:
            self.SetTitle("Button 1 clicked")
        elif event.Id == self.button2.Id:
            self.SetTitle("Button 2 clicked")            

application = wx.PySimpleApp()
window = MyFrame()
application.MainLoop()

7 个回答

7

我建议你为每个按钮使用不同的事件处理器来处理事件。如果这些按钮的处理逻辑有很多相似的地方,你可以把这些相似的部分放到一个函数里,这个函数会返回一个具有特定行为的函数。例如:

def goingTo(self, where):
    def goingToHandler(event):
        self.SetTitle("I'm going to " + where)
    return goingToHandler

def __init__(self):
    buttonA.Bind(wx.EVT_BUTTON, self.goingTo("work"))
    # clicking will say "I'm going to work"
    buttonB.Bind(wx.EVT_BUTTON, self.goingTo("home"))
    # clicking will say "I'm going to home"
8

好好利用像Python这样的编程语言的特性。你可以给你的事件回调函数传递额外的参数,像这样。

import functools

def __init__(self):
    # ...
    for i in range(10):
        name = 'Button %d' % i
        button = wx.Button(parent, -1, name)
        func = functools.partial(self.on_button, name=name)
        button.Bind(wx.EVT_BUTTON, func)
    # ...

def on_button(self, event, name):
    print '%s clicked' % name

当然,这些参数可以是你想要的任何东西。

13

你可以给按钮起个名字,然后在事件处理程序中查看这个名字。

当你创建按钮的时候:

b = wx.Button(self, 10, "Default Button", (20, 20))
b.myname = "default button"
self.Bind(wx.EVT_BUTTON, self.OnClick, b)

当按钮被点击时:

def OnClick(self, event):
    name = event.GetEventObject().myname

撰写回答