Использование одного и того же обработчика для нескольких wx.TextCtrls?

StackOverflow https://stackoverflow.com/questions/1628010

  •  06-07-2019
  •  | 
  •  

Вопрос

У меня возникли некоторые проблемы с панелью, в которой есть два элемента 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 () должны работать, хотя у меня (пока) нет Mac, на котором можно их примерить.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top