首页 > 编程问答 >如何在事件wxWidgets中传递自定义数据

如何在事件wxWidgets中传递自定义数据

时间:2024-07-28 06:22:46浏览次数:13  
标签:python wxpython wxwidgets

情况

我目前正在使用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

相关文章

  • 当我们创建一个在 https 服务器上获取和发送数据的 python 应用程序时,我们应该如何处
    python脚本使用Urllib3,我的服务器是在Node.js上编写的脚本。我担心(并且不清楚)证书:我是否需要将我的python应用程序上的证书另存为变量?例如我这样做了,http=urllib3.PoolManager(cert_reqs="CERT_REQUIRED",ca_certs='client-cert.pem')并且我不知道......
  • 使用 Python 进行 Web 抓取以获取数据 NoneType ERROR
    我正在努力为我的学校项目获取美元和价格。所以我决定为此使用网络抓取,但我有一个问题。当我尝试在服务器上使用我的代码时,它给我NoneType错误。它可以在googlecolab上使用,但我无法在我的电脑或服务器上使用。我该如何解决这个问题?网页抓取代码;defdolar():he......
  • Python 请求 - response.json() 未按预期工作
    我正在尝试从Python的requests模块调用API。在邮递员上,返回的响应标头中的Content-Type是application/json;charset=utf-8,响应json数据是我期望的样子。但是,在python上的API的get方法之后运行response.json()会抛出错误simplejson.errors......
  • Python 中的“样板”代码?
    Google有一个Python教程,他们将样板代码描述为“不幸的”,并提供了以下示例:#!/usr/bin/python#importmodulesusedhere--sysisaverystandardoneimportsys#Gatherourcodeinamain()functiondefmain():print'Hellothere',sys.argv[1]#Command......
  • Python 3.9.1 中的 collections.abc.Callable 是否有 bug?
    Python3.9包含PEP585并弃用typing模块中的许多类型,转而支持collections.abc中的类型,现在它们支持__class_getitem__例如Callable就是这种情况。对我来说,typing.Callable和collections.abc.Ca......
  • 列表子类的 Python 类型
    我希望能够定义列表子类的内容必须是什么。该类如下所示。classA(list):def__init__(self):list.__init__(self)我想包含键入内容,以便发生以下情况。importtypingclassA(list:typing.List[str]):#Maybesomethinglikethisdef__init__(self):......
  • Python 中类型友好的委托
    考虑以下代码示例defsum(a:int,b:int):returna+bdefwrap(*args,**kwargs):#delegatetosumreturnsum(*args,**kwargs)该代码运行良好,只是类型提示丢失了。在Python中使用*args,**kwargs来实现​​委托模式是很常见的。如果有一种方法可......
  • 使用 python 支持构建自定义 vim 二进制文件
    背景Debian11vim软件包不包含python3支持。请参阅标题为“Debian11vim中不支持python-证据”的部分下面我需要vim支持python3YouCompleteMevim插件为了构建一个新的,我将vim9.0tarball下载到v......
  • 如何在Python 3.12+中正确使用泛型来提高代码质量?
    我正在尝试使用泛型来改进FastAPI应用程序中的类型注释。我有一个抽象存储库类,在其中使用泛型:fromabcimportABC,abstractmethodfromtypingimportListclassAbstractRepository[T](ABC):@abstractmethodasyncdefadd_one(self,data:dict)->T:......
  • python中的while循环不退出
    我试图完成第一年的python商业课程作业,但我的while循环无法退出,有人能帮忙吗?commisionTable=[{"admin_fee":100,"comm_rate":0.10},{"admin_fee":125,"comm_rate":0.12},{"admin_fee":150,"comm_rate":......