33

私は他の場所で答えを見つけていません.これはまだSOで尋ねられていないようです.

wxPython でイベント バインディングを作成する場合、追加の引数をイベントに渡すことはできますか? たとえば、これは通常の方法です。

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())

しかし、メソッドに別の引数を渡すことは可能ですか? 複数のウィジェットがそれを呼び出しているが、それでも同じ値を返すかどうかをメソッドが判断できるようにするには?

同じコードのコピーと貼り付けを大幅に減らすことができますが、呼び出し元は異なります。

4

2 に答える 2

48

いつでもラムダまたは別の関数を使用してメソッドをラップし、WX 固有ではない別の引数を渡すことができます。

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())

入力するコードの量を減らしたい場合は、次のような自動化を試すこともできます。

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')
于 2008-10-06T09:38:08.597 に答える
14

最も良い方法は、イベント ハンドラーのジェネレーターを作成することです。たとえば、次のようになります。

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

次に、次のようにバインドします。

b = wx.Button(self, 10, "Default Button", (20, 20))
b.Bind(wx.EVT_BUTTON, self.getOnClick('my additional data'))
于 2008-10-06T10:33:33.383 に答える