複数のwx.TextCtrlsに同じハンドラーを使用していますか?
質問
2つのwxPython TextCtrlを含むパネルで少し問題があります。 EVT_CHARハンドラーまたはEVT_KEY_UPハンドラーの両方を両方のコントロールにバインドし、どのTextCtrlがイベントを生成したかを確認できるようにします。 event.Idがこれを教えてくれると思いますが、次のサンプルコードでは常に0です。これはOS Xでのみテストしました。
このコードは、[完了]ボタンを有効にする前に、両方のTextCtrlにテキストが含まれていることを確認するだけです
import wx
class MyFrame(wx.Frame):
def __init__(self, parent, ID, title):
wx.Frame.__init__(self, parent, ID, title,
wx.DefaultPosition, wx.Size(200, 150))
self.panel = BaseNameEntryPanel(self)
class BaseNameEntryPanel(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent, -1)
self.entry = wx.TextCtrl(self, wx.NewId())
self.entry2 = wx.TextCtrl(self, wx.NewId())
self.donebtn = wx.Button(self, wx.NewId(), "Done")
self.donebtn.Disable()
vsizer = wx.BoxSizer(wx.VERTICAL)
vsizer.Add(self.entry, 1, wx.EXPAND|wx.GROW)
vsizer.Add(self.entry2, 1, wx.EXPAND|wx.GROW)
vsizer.Add(self.donebtn, 1, wx.EXPAND|wx.GROW)
self.SetSizer(vsizer)
self.Fit()
self.entry.Bind(wx.EVT_KEY_UP, self.Handle)
self.entry2.Bind(wx.EVT_KEY_UP, self.Handle)
def Handle(self, event):
keycode = event.GetKeyCode()
print keycode, event.Id # <- event.Id is always 0!
def checker(entry):
return bool(entry.GetValue().strip())
self.donebtn.Enable(checker(self.entry) and checker(self.entry2))
class MyApp(wx.App):
def OnInit(self):
frame = MyFrame(None, -1, "Hello from wxPython")
frame.Show(True)
self.SetTopWindow(frame)
return True
app = MyApp(0)
app.MainLoop()
解決
event.GetId()
または event.GetEventObject()
を試して、これらのいずれかが機能するかどうかを確認できます。
これに対する別のアプローチは、ラムダまたはfunctools.partialを使用して、パラメーターをハンドラーに効果的に渡すことです。そのため、たとえば、プログラムの次の行のsub:
self.entry.Bind(wx.EVT_KEY_UP, functools.partial(self.Handle, ob=self.entry))
self.entry2.Bind(wx.EVT_KEY_UP, functools.partial(self.Handle, ob=self.entry2))
def Handle(self, event, ob=None):
print ob
そしてobは、クリックされたパネルに応じて entry
または entry2
になります。しかし、もちろん、これは必要ではなく、GetIdとGetEventObject()は両方とも動作するはずです-私は(まだ)これらを試すMacを持っていません。
所属していません StackOverflow