我目前正在用wxPython(wxWidgets for Python)编写一个应用程序。
在这个应用程序中显示了一个对话列表,在每一行的末尾有一个 "打开对话 "按钮。让我们称这个窗口为 "所有对话"。
点击任何一个按钮都会调用函数 "open_conversation(self, event)",从而显示全部对话。
我想做的是,在生成 "All conversations "窗口时,在每个 "Bind "事件或每个 "wxButton "对象中传递一些自定义数据,例如一个字符串(例如联系人的名字);之后,当一个按钮被点击时,它将在 "event "参数中传递这些数据,在函数中变得可以访问,比如说:"open_conversation(self, event)"。contact = event.CustomData["recipient"]
.
提及 文件我找到了 "Bind "方法的 "userData "关键字,但看起来它在Python中不起作用。
self.openConversation_button.Bind(wx.EVT_BUTTON, self.open_conversation, userData="test")
TypeError: _EvtHandler_Bind() got an unexpected keyword argument 'userData'
我把Rolf of Saxony的解决方案标记为正确的,因为它最符合我的需求,但是我建议一般情况下使用VZ建议的自定义事件系统。
一个简单的方法来传递自定义数据到一个 callback
事件是使用一个 lambda
函数,例如
import wx
class ButtonFrame(wx.Frame):
def __init__(self, value):
wx.Frame.__init__(self,None)
self.btn1 = wx.Button(self, -1, ("a"))
self.btn2 = wx.Button(self, -1, ("b"))
self.btn3 = wx.Button(self, -1, ("No flag"))
self.btnSizer = wx.BoxSizer(wx.HORIZONTAL)
self.btnSizer.Add(self.btn1 , 0, wx.RIGHT, 10)
self.btnSizer.Add(self.btn2 , 0, wx.RIGHT, 10)
self.btnSizer.Add(self.btn3 , 0, wx.RIGHT, 10)
self.btn1.Bind(wx.EVT_BUTTON, lambda event: self.OnButton(event, flag="A"))
self.btn2.Bind(wx.EVT_BUTTON, lambda event: self.OnButton(event, flag="B"))
self.btn3.Bind(wx.EVT_BUTTON, self.OnButton)
self.SetSizer(self.btnSizer)
self.Show()
def OnButton(self,event, flag=None):
if flag:
print ("Button pressed was "+flag)
else:
print ("A button got pressed")
if __name__ == "__main__":
app = wx.App()
ButtonFrame(None)
app.MainLoop()
一般来说,定义一个自定义事件的建议肯定是正确的,但如果你需要的只是一个字符串或数字,你也可以重新使用现有的 wxCommandEvent
类,并使用其 SetString()
或 SetInt()
方法;