после рефакторинга

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# 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