# encoding: cp1251 import wx class RussianUpperCaseValidator(wx.PyValidator): def __init__(self): wx.PyValidator.__init__(self) self.Bind(wx.EVT_CHAR, self.OnChar) self.ignored_keys = [ wx.WXK_UP, wx.WXK_DOWN, wx.WXK_LEFT, wx.WXK_HOME, wx.WXK_END, wx.WXK_BACK, wx.WXK_DELETE, wx.WXK_SPACE, wx.WXK_ESCAPE ] self.allowed = u"йцукенгшщзхъфывапролджэячсмитьбюё-?*." def OnChar(self, event): ctrl = self.GetWindow() # XXX: внимание, хардкод # по непонятным причинам, event.GetUniChar и event.GetUnicodeKey # возвращают не юникодную точку, а код в текущей локали (если она 8-битная) # или вообще глючат и onevent не срабатывает (при локали utf-8) # у нас локаль захардкодена -- cp1251, так что мы просто берем keycode # и "честно" пытаемся его переделать в юникод code = event.GetKeyCode() if code < 255: xchar = chr(code) uchar = xchar.decode('cp1251') else: print "What the f**k, key code is %d" % code uchar = ' ' if ctrl.IsEditable() and uchar.isalpha(): if uchar.lower() in self.allowed: ctrl.WriteText(uchar.upper()) else: event.Skip() # wx validator api def Clone(self): return self.__class__() def Validate(self, parent=None): return True def TransferToWindow(self): return self.TransferDataToWindow() def TransferFromWindow(self): return self.TransferDataFromWindow() def TransferDataToWindow(self): return True def TransferDataFromWindow(self): return True