情况
我目前正在使用wxPython(wxWidgets for Python)编写一个应用程序。
在此应用程序中显示了一个对话列表,每行末尾都有一个“打开对话”按钮。我们将此窗口称为“所有对话”。
单击任何一个按钮都会调用函数“open_conversation(self, event)”,该函数会显示完整的对话。
我想要做的是,在生成在“所有对话”窗口中,在每个“Bind”事件或每个“wxButton”对象中传递一些自定义数据,例如字符串(例如联系人的姓名);之后,当单击按钮时,它将在“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 的解决方案标记为正确的,因为它符合我的需要最好,但我建议一般使用 VZ 建议的自定义事件系统。
使用
Bind
方法的
userData
参数在 wxPython 中不起作用,因为它是 wxWidgets C++ API 的一部分,而没有直接在 Python 包装器中公开。不过,你有几种方法可以在 wxPython 中实现类似的功能:
1. 使用 lambda 函数:
这是最直接的方法,你可以在其中创建一个 lambda 函数来处理事件并将你的自定义数据传递给你的
open_conversation
函数。
for contact in contacts:
button = wx.Button(self, label="打开对话")
button.Bind(wx.EVT_BUTTON, lambda event, contact=contact: self.open_conversation(event, contact))
此代码为每个联系人创建一个按钮,并使用一个带有
contact=contact
默认值的 lambda 函数。当点击按钮时,lambda 函数调用
open_conversation
并传递事件和相关的
contact
数据。
2. 子类化
wx.Button
:
你可以创建一个自定义按钮类来存储你的自定义数据,并在事件处理程序中访问它。
class MyButton(wx.Button):
def __init__(self, parent, contact, *args, **kwargs):
super().__init__(parent, *args, **kwargs)
self.contact = contact
...
for contact in contacts:
button = MyButton(self, contact, label="打开对话")
button.Bind(wx.EVT_BUTTON, self.open_conversation)
def open_conversation(self, event):
button = event.GetEventObject()
contact = button.contact
# 使用 contact 数据
此代码定义了一个新的按钮类
MyButton
,它存储了一个
contact
属性。在
open_conversation
函数中,你可以使用
event.GetEventObject()
获取对按钮的引用,并访问其
contact
属性。
3. 使用字典将数据与按钮关联:
你可以创建一个字典来存储按钮和自定义数据之间的映射关系。
self.button_data = {}
...
for contact in contacts:
button = wx.Button(self, label="打开对话")
self.button_data[button] = contact
button.Bind(wx.EVT_BUTTON, self.open_conversation)
def open_conversation(self, event):
button = event.GetEventObject()
contact = self.button_data.get(button)
# 使用 contact 数据
此代码创建一个字典
self.button_data
,用于将每个按钮与其对应的
contact
数据相关联。在事件处理程序中,你可以使用
event.GetEventObject()
获取按钮,并使用它在字典中查找相关数据。
选择哪种方法取决于你的具体需求和编程风格。lambda 函数方法最简单直接,而子类化方法提供了更多结构和封装。使用字典是一种灵活的解决方案,但需要你管理按钮和数据之间的映射关系。
标签:python,wxpython,wxwidgets From: 61856634