문제

나는 두 개의 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 ()는 둘 다 작동해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top