2008-10-06 12 views
25

Tôi chưa tìm thấy câu trả lời ở nơi khác và điều này dường như chưa được hỏi trên SO.Có thể chuyển đối số thành các kết buộc sự kiện không?

Khi tạo liên kết sự kiện trong wxPython, bạn có thể chuyển đối số bổ sung cho sự kiện không? Ví dụ: đây là cách thông thường:

b = wx.Button(self, 10, "Default Button", (20, 20)) 
     self.Bind(wx.EVT_BUTTON, self.OnClick, b) 
def OnClick(self, event): 
     self.log.write("Click! (%d)\n" % event.GetId()) 

Nhưng có thể có đối số khác được chuyển cho phương pháp không? Như vậy mà phương pháp có thể cho biết nếu nhiều hơn một widget đang gọi nó nhưng vẫn trả về cùng một giá trị?

Nó sẽ làm giảm đáng kể bản sao & dán cùng mã nhưng với những người gọi khác nhau.

Trả lời

42

Bạn luôn có thể sử dụng hàm lambda hoặc hàm khác để kết thúc phương thức của mình và chuyển đối số khác, chứ không phải WX cụ thể.

b = wx.Button(self, 10, "Default Button", (20, 20)) 
     self.Bind(wx.EVT_BUTTON, lambda event: self.OnClick(event, 'somevalue'), b) 
def OnClick(self, event, somearg): 
     self.log.write("Click! (%d)\n" % event.GetId()) 

Nếu bạn ra ngoài để giảm số tiền mã để gõ, bạn cũng có thể thử một chút thuyết tự động như:

class foo(whateverwxobject): 
    def better_bind(self, type, instance, handler, *args, **kwargs): 
     self.Bind(type, lambda event: handler(event, *args, **kwargs), instance) 

    def __init__(self): 
     self.better_bind(wx.EVT_BUTTON, b, self.OnClick, 'somevalue') 
+0

Câu trả lời hay. Cảm ơn! –

11

Cách đẹp nhất sẽ được để tạo ra một máy phát điện của xử lý sự kiện, ví dụ:

def getOnClick(self, additionalArgument): 
    def OnClick(self, event): 
     self.log.write("Click! (%d), arg: %s\n" 
         % (event.GetId(), additionalArgument)) 
    return OnClick 

Bây giờ bạn gắn nó với:

b = wx.Button(self, 10, "Default Button", (20, 20)) 
b.Bind(wx.EVT_BUTTON, self.getOnClick('my additional data'))