在wxPython中使用参数调用事件

时间:2014-07-01 09:06:26

标签: python wxpython

我在wx Python中编写应用程序,该应用程序应该获取一些值,输入到TextCtrl框中,并在按下开始按钮时将它们传递给函数。事实证明这很复杂。

这是剧本:

class Example(wx.Frame):

    def __init__(self, parent, title):
        super(Example, self).__init__(parent, title=title,
            size=(300, 200))

        self.InitUI()
        self.Centre()
        self.Show()

    def InitUI(self):

        panel = wx.Panel(self)

        sizer = wx.GridBagSizer(4, 2)

        text1 = wx.StaticText(panel, label="Set COM-ports")
        sizer.Add(text1, pos=(0, 0), flag=wx.TOP|wx.LEFT|wx.BOTTOM,
            border=15)

        line = wx.StaticLine(panel)
        sizer.Add(line, pos=(1, 0), span=(1, 5),
            flag=wx.EXPAND|wx.BOTTOM, border=10)

        text2 = wx.StaticText(panel, label="Dispersion control port:")
        sizer.Add(text2, pos=(2, 0), flag=wx.ALIGN_RIGHT|wx.LEFT, border=10)

        tc1 = wx.TextCtrl(panel)
        sizer.Add(tc1, pos=(2, 1), flag=wx.LEFT, border=10)

        text3 = wx.StaticText(panel, label="GPS port:")
        sizer.Add(text3, pos=(3, 0),flag=wx.ALIGN_RIGHT|wx.LEFT, border=10)

        tc2 = wx.TextCtrl(panel)
        sizer.Add(tc2, pos=(3, 1), flag=wx.LEFT,border=10)

        button4 = wx.Button(panel, label="Start")
        DispPort=tc1.GetValue()
        GpsPort=tc2.GetValue()
        sizer.Add(button4, pos=(4, 0), flag=wx.ALIGN_RIGHT)
        button4.Bind(wx.EVT_BUTTON, self.OnStart(self, event,DispPort,GpsPort))

        button5 = wx.Button(panel, wx.ID_EXIT, label="Cancel")
        sizer.Add(button5, pos=(4, 1), flag=wx.ALIGN_LEFT|wx.LEFT, border=10)
        self.Bind(wx.EVT_BUTTON, self.OnQuitApp, id=wx.ID_EXIT)

        panel.SetSizer(sizer)

    def OnStart(self, event, DispPort, GpsPort):
        stdial=Startclass(self,DispPort,GpsPort)

    def OnQuitApp(self, event):

        self.Close()

正如您所看到的,OnQuitApp()不需要调用任何参数,甚至不需要括号。另一方面,OnStart()需要参数。我想要包括的是DispPort和GpsPort。但是写作

self.OnStart(DispPort,GpsPort)

不起作用。写

self.OnStart(self, DispPort,GpsPort)

也不起作用。

也没有
self.OnStart(self,event,DispPort,GpsPort)

第一个有两个参数,第二个获取的参数是错误的类型,第三个使用未定义的变量' event'。

我从哪里开始?

1 个答案:

答案 0 :(得分:2)

简答:您可能有错误如何处理事件。绑定时,你传递一个函数/方法引用(并没有像你那样调用它)!当事件被触发(通过单击)时, wxPython调用具有参数event的事件处理程序!在你的情况下,你会写:

    self.tc1 = tc1
    # bind buton click to event handler. You pass the function!
    button4.Bind(wx.EVT_BUTTON, self.OnStart)

    …
# the event handler. The parameter ``event`` is mandatory! 
def onStart(self, event):
    DispPort = self.tc1.GetValue()
    GpsPort = self.tc2.GetValue()
    stdial = Startclass(self, DispPort, GpsPort)

长答案:Yo实际上可以将参数传递给事件处理程序,但在这种简单的情况下,这不是必需的。您可以使用lambda: …执行此操作,有关详细信息,请参阅Link。但通常不需要这样做,如果wxWidgets没有涵盖事件传递的要求,请使用类似pubsub的内容。