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

问题描述 投票:0回答:1

状况

我目前正在用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建议的自定义事件系统。

python wxpython wxwidgets
1个回答
0
投票

一个简单的方法来传递自定义数据到一个 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()

1
投票

一般来说,定义一个自定义事件的建议肯定是正确的,但如果你需要的只是一个字符串或数字,你也可以重新使用现有的 wxCommandEvent 类,并使用其 SetString()SetInt() 方法;

© www.soinside.com 2019 - 2024. All rights reserved.