Python 如何在事件wxWidgets中传递自定义数据 情况
我目前正在用wxPython(用于Python的wxWidgets)编写一个应用程序 在这个应用程序中,会显示一个对话列表,每行末尾都有一个“打开对话”按钮。让我们将此窗口称为“所有对话” 单击任意一个按钮调用函数“打开会话(self,event)”,该函数显示完整的会话 我想做的是,在生成“所有对话”窗口时,在每个“绑定”事件或每个“wxButton”对象中传递一些自定义数据,例如字符串(例如联系人的名称);之后,当单击按钮时,它将在“事件”参数中传递所述数据,并通过类似于Python 如何在事件wxWidgets中传递自定义数据 情况,python,wxpython,wxwidgets,Python,Wxpython,Wxwidgets,我目前正在用wxPython(用于Python的wxWidgets)编写一个应用程序 在这个应用程序中,会显示一个对话列表,每行末尾都有一个“打开对话”按钮。让我们将此窗口称为“所有对话” 单击任意一个按钮调用函数“打开会话(self,event)”,该函数显示完整的会话 我想做的是,在生成“所有对话”窗口时,在每个“绑定”事件或每个“wxButton”对象中传递一些自定义数据,例如字符串(例如联系人的名称);之后,当单击按钮时,它将在“事件”参数中传递所述数据,并通过类似于contact=ev
contact=event.CustomData[“recipient”]
的功能访问这些数据
问题
参考,我找到了“Bind”方法的“userData”关键字,但它在Python中似乎不起作用
self.openConversation\u button.Bind(wx.EVT\u button,self.open\u conversation,userData=“test”)
TypeError:_EvtHandler_Bind()获取了意外的关键字参数“userData”
使现代化
我已经将萨克森Rolf的解决方案标记为正确的,因为它最适合我的需要,但是我建议一般使用VZ建议的自定义事件系统。一般来说,定义自定义事件的建议绝对是正确的,但是如果您只需要一个字符串和/或数字,您还可以重新调整现有
wxCommandEvent
类的用途,并使用其SetString()
或SetInt()
方法。将自定义数据传递到回调
事件的简单方法是使用lambda
函数。e、 g
对于任何一个完全C++的人来说,这里是:
#包括
结构CustomData最终版:公共wxClientData{
std::string myString;
};
结构MyApp最终版本:公共wxApp{
bool OnInit()决赛;
};
结构MyWindow最终版本:公共wxFrame{
静态constexpr int ID_MY_按钮{42};
MyWindow();
MyWindow(MyWindow常量&)=删除;
MyWindow&运算符=(MyWindow常量&)=删除;
作废按钮(wxCommandEvent&event);
wxDECLARE_事件_表();
};
bool MyApp::OnInit(){
MyWindow*常量窗口{new MyWindow()};
窗口->显示(真);
返回true;
}
MyWindow::MyWindow(){
wxButton*const myButton{newwxButton(这个,ID_MY_按钮)};
CustomData*constmydata{new CustomData()};
myData->myString=“你好,世界!”;
myButton->SetClientObject(myData);
}
void MyWindow::OnButton(wxCommandEvent和事件){
wxEvtHandler常量*常量eventObject{static_cast(event.GetEventObject())};
if(eventObject==nullptr){
回来
}
CustomData常量*常量myData{static_cast(eventObject->GetClientObject())};
如果(myData==nullptr){
回来
}
std::你可以创建一个自定义事件吗?看吧,我会深入研究这个问题;我可以假设没有内置的方法来做这件事吗?哇,很好!我今天下午会研究这个问题,如果可以的话,我会在今晚关闭线程!好的,很高兴知道!对于大型应用程序,我可以理解编写自定义事件,但是在我的情况下,只传递一个字符串/Int已经足够了,所以我会研究一下你提到的函数。谢谢
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()