2012-06-28 3 views
4

Возможно ли передать дополнительные аргументы для обратного вызова события?Как передать дополнительные аргументы для обратного вызова события?

Например, если привязка к событию выглядела так:

self.Bind(wx.EVT_BUTTON, self.do_something, self.button) 

Как передать аргументы методу?

self.do_something(self,event,arguments): 
    """do something with arguments""" 
    pass 
+0

возможно дубликат (http://stackoverflow.com/questions/173687/is-it-possible-to-pass-arguments-in-event-bindings) – ecatmur

ответ

4

Использование лямбда:

self.Bind(wx.EVT_BUTTON, lambda event, args=args: self.do_something(event, args), self.button) 

self.do_something(self,event,arguments): 
    """do something with arguments""" 
    pass 
+0

lambda может повредить вам, если вы используете его в цикле for. Я предпочитаю метод functools.partial. – FogleBird

+1

@FogleBird, беспорядок может произойти, если вы напишите 'lambda event: self.do_something (event, args)' вместо 'lambda event, args = args: self.do_something (event, args)' (note 'args = args') – warvariuc

6

Использование functools.partial, или в общем случае lambda expression.

Частичная форма будет

functools.partial(self.do_something, args) 

Обратите внимание, что в этом случае event аргумент будет принят в конце списка аргументов. Эквивалентная форма лямбды:

lambda event: self.do_something(args, event) 
1

Это не ясно, когда вы хотите предоставить эти аргументы, но если вы хотите, чтобы обеспечить их Bind времени (например, что вы можете иметь do_something, который поддерживает множество применений), вы можете использовать functools.partial:

def do_something(self, arg, event): 
    pass 

self.Bind(wx.EVT_BUTTON, functools.partial(self.do_something, arg), self.button) 

Тогда, когда do_something называется, она будет называться с arg вы передаваемым в partial, а также события, передаваемый в обратном вызове.

+0

Я забыл об этом. Я просто использую лямбда. –

1

Используйте лямбда-функцию. На этой странице есть документация по wxPython wiki. Я также написал об этом в своем lambda tutorial. Вот хромой пример, который я создал, когда я писал, что (что в статье тоже): [? Можно ли передавать аргументы в привязки событий]

import wx 

######################################################################## 
class DemoFrame(wx.Frame): 
    """ 
    Frame that holds all other widgets 
    """ 

    #---------------------------------------------------------------------- 
    def __init__(self): 
     """Constructor"""   
     wx.Frame.__init__(self, None, wx.ID_ANY, 
          "wx lambda tutorial", 
          size=(600,400) 
         ) 
     panel = wx.Panel(self) 

     button8 = wx.Button(panel, label="8") 
     button8.Bind(wx.EVT_BUTTON, lambda evt, name=button8.GetLabel(): self.onButton(evt, name)) 
     button10 = wx.Button(panel, label="10") 
     button10.Bind(wx.EVT_BUTTON, lambda evt, name=button10.GetLabel(): self.onButton(evt, name)) 

     sizer = wx.BoxSizer(wx.HORIZONTAL) 
     sizer.Add(button8, 0, wx.ALL, 5) 
     sizer.Add(button10, 0, wx.ALL, 5) 
     panel.SetSizer(sizer) 

    #---------------------------------------------------------------------- 
    def onButton(self, event, buttonLabel): 
     """""" 
     print "You pressed the %s button!" % buttonLabel 

# Run the program 
if __name__ == "__main__": 
    app = wx.App(False) 
    frame = DemoFrame().Show() 
    app.MainLoop() 
Смежные вопросы