1
2
3
4
5 import pygtk
6 pygtk.require('2.0')
7 import gtk
8 import re
9 from gtk import *
10 import gtk.gdk
11 import gobject
12
13
14
15
16 class EntryMask(gtk.Entry):
17
18 def __init__(self):
19
20 self.gtkentry=gtk.Entry.__init__(self)
21 self.chars = re.compile(r'[\-\.\(\)/{_}|]')
22 self.set_text('')
23 hid = self.connect_after('insert-text', self.filter)
24 self.set_data('handlerid', hid)
25
26
27 def set(self, text, *args):
28
29 hid = self.get_data('handlerid')
30 self.handler_block(hid)
31 self.set_text(text)
32 self.set_position(self.z)
33 self.handler_unblock(hid)
34
35
36 def filter(self, *args):
37 _text=self.get_text()
38 _text=self.unmask(_text)
39 _new=self.mask(_text)
40 gobject.timeout_add(1, self.set , _new)
41
42
43 def validate(self, text_char, mask_char):
44
45 num = re.compile(r'[0-9]')
46 lettup = re.compile(r'[A-Z]')
47 lettdw = re.compile(r'[a-z]')
48
49 if mask_char == '9':
50 valid = num.match(text_char)
51 elif mask_char == 'a':
52 valid = lettdw.match(text_char)
53 elif mask_char == 'A':
54 valid = lettup.match(text_char)
55 elif mask_char == 'X':
56 valid = (num.match(text_char) or
57 lettdw.match(text_char) or
58 lettup.match(text_char))
59
60 return valid
61
62 def mask(self, _text):
63
64 len_mask=int(len(self._mask))
65 self._mask=list(self._mask)
66 _len=int(len(_text))
67 _text=list(_text)
68 z=0
69 m=0
70 new=''
71 for n in range(len_mask):
72 mask_char=self._mask[n]
73 if z<_len:
74 if self.chars.match(mask_char):
75 new=new+mask_char
76 m=m+1
77
78 else:
79 text_char=_text[z]
80 if self.validate(text_char, mask_char):
81 new=new+text_char
82 z=z+1
83 self.z=z+m
84 return new
85
86 def unmask(self, _text):
87 _text=self.chars.sub('',_text)
88 return _text
89
90 def set_mask(self, _mask):
91 self._mask=_mask
92 self.set_max_length(len(self._mask))
93
94
95
96
97 class EntryExample:
98
99 def entry_toggle_editable(self, checkbutton, entry):
100 entry.set_editable(checkbutton.get_active())
101
102 def entry_toggle_visibility(self, checkbutton, entry):
103 entry.set_visibility(checkbutton.get_active())
104
105 def __init__(self):
106
107 window = gtk.Window(gtk.WINDOW_TOPLEVEL)
108 window.set_size_request(200, 100)
109 window.set_title("Teste de EntryMask")
110 window.connect("delete_event", lambda w,e: gtk.main_quit())
111
112 vbox = gtk.VBox(False, 0)
113 window.add(vbox)
114 vbox.show()
115
116 entry = EntryMask()
117 entry.set_mask('99.999.999/9999-XX')
118 vbox.pack_start(entry, True, True, 0)
119 entry.show()
120
121 hbox = gtk.HBox(False, 0)
122 vbox.add(hbox)
123 hbox.show()
124
125 check = gtk.CheckButton("Editavel")
126 hbox.pack_start(check, True, True, 0)
127 check.connect("toggled", self.entry_toggle_editable, entry)
128 check.set_active(True)
129 check.show()
130
131 check = gtk.CheckButton("Visivel")
132 hbox.pack_start(check, True, True, 0)
133 check.connect("toggled", self.entry_toggle_visibility, entry)
134 check.set_active(True)
135 check.show()
136
137 button = gtk.Button(stock=gtk.STOCK_CLOSE)
138 button.connect("clicked", lambda w: gtk.main_quit())
139 vbox.pack_start(button, True, True, 0)
140 button.set_flags(gtk.CAN_DEFAULT)
141 button.grab_default()
142 button.show()
143 window.show()
144
145 def main():
146 gtk.main()
147 return 0
148
149 if __name__ == "__main__":
150 EntryExample()
151 main()