我在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'。
我从哪里开始?
答案 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
的内容。