Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在事件wxWidgets中传递自定义数据 情况_Python_Wxpython_Wxwidgets - Fatal编程技术网

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

Python 如何在事件wxWidgets中传递自定义数据 情况,python,wxpython,wxwidgets,Python,Wxpython,Wxwidgets,我目前正在用wxPython(用于Python的wxWidgets)编写一个应用程序 在这个应用程序中,会显示一个对话列表,每行末尾都有一个“打开对话”按钮。让我们将此窗口称为“所有对话” 单击任意一个按钮调用函数“打开会话(self,event)”,该函数显示完整的会话 我想做的是,在生成“所有对话”窗口时,在每个“绑定”事件或每个“wxButton”对象中传递一些自定义数据,例如字符串(例如联系人的名称);之后,当单击按钮时,它将在“事件”参数中传递所述数据,并通过类似于contact=ev

我目前正在用wxPython(用于Python的wxWidgets)编写一个应用程序

在这个应用程序中,会显示一个对话列表,每行末尾都有一个“打开对话”按钮。让我们将此窗口称为“所有对话”

单击任意一个按钮调用函数“打开会话(self,event)”,该函数显示完整的会话

我想做的是,在生成“所有对话”窗口时,在每个“绑定”事件或每个“wxButton”对象中传递一些自定义数据,例如字符串(例如联系人的名称);之后,当单击按钮时,它将在“事件”参数中传递所述数据,并通过类似于
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()