여러 wx.textctrls에 동일한 핸들러 사용?
문제
나는 두 개의 wxpython textctrls가있는 패널에 약간의 문제가 있습니다. EVT_CHAR 또는 EVT_KEY_UP 핸들러가 두 컨트롤에 바인딩되기를 원하며 어떤 TextCtrl이 이벤트를 생성했는지 알 수 있습니다. 나는 그 이벤트가 나에게 이것을 말할 것이라고 생각하지만, 다음 샘플 코드에서는 항상 0입니다. 어떤 생각이든? 나는 이것을 OS X에서만 테스트했습니다.
이 코드는 단순히 완료 버튼을 활성화하기 전에 두 TextCtrls에 텍스트가 있는지 확인합니다.
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()
그리고이 일 중 하나가 작동하는지 확인하십시오.
이에 대한 또 다른 접근법은 Lambda 또는 FuncTools.partial을 사용하여 매개 변수를 핸들러에 효과적으로 전달하는 것입니다. 예를 들어, 아래 줄에 프로그램에 대한 하위가 있습니다.
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 ()는 둘 다 작동해야합니다.
제휴하지 않습니다 StackOverflow