PyValidator [Pythonw warning: Could not transfer data to window]
Bonjour,
J'utilise des validateurs dans des wx.TextCtrl en plusieurs endroits de mon interface, mais quand je les emploie dans une boîte de dialogue, ils créent un message d'avertissement lors de la création de la boîte, bien qu'ils fonctionnent.
Le message d'avertissement est le suivant :
Code:
1 2 3
|
Pythonw warning
Could not transfer data to window |
On clique sur OK puis la boite de dialogue apparaît et fonctionne normalement, même les validateurs.
Le code suivant engendre l'avertissement ci-dessus :
Code:
1 2 3 4 5 6
|
class InscriptionDialog (wx.Dialog):
def __init__ (self, mainwindow, [ligne écourtée]):
wx.Dialog.__init__ (self, mainwindow, -1, title, pos, size, style)
self.mainwindow = mainwindow
self.login = wx.TextCtrl(self, -1, "", validator=MyValidator("LOGIN")) |
Ce code n'engendre pas d'avertissement :
Code:
1 2 3 4 5 6
|
class VerbPanel (wx.Panel):
def __init__ (self, notebook, mainwindow):
wx.Panel.__init__ (self, notebook, -1)
self.mainwindow = mainwindow
self.login = wx.TextCtrl(self, -1, "", validator = MyValidator("LOGIN")) |
Il est certain que les validateurs engendrent le message d'avertissement lors de la création de la boîte de dialogue, car si je les enlève, le message n'apparaît plus.
Autre constatation : il semble bien que les validateurs n'aiment pas fonctionner avec wx.Dialog, car si je remplace, dans la classe InscriptionDialog :
Code:
1 2
|
self.login = wx.TextCtrl(self, -1, "", validator=MyValidator("LOGIN")) |
par:
Code:
1 2
|
self.login = wx.TextCtrl(mainwindow, -1, "", validator=MyValidator("LOGIN")) |
Il n'y plus de message d'avertissement... Bien sûr, mon champ n'apparaît pas dans ma boîte de dialogue, mais dans la fenêtre principale de mon interface.
Voici la classe MyValidator :
Code:
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
|
class MyValidator (wx.PyValidator):
def __init__ (self, mode):
wx.PyValidator.__init__(self)
self.mode = mode
self.Bind(wx.EVT_CHAR, self.OnChar)
def Clone (self):
return MyValidator(self.mode)
def Validate (self, win):
tc = self.GetWindow()
chaine = tc.GetValue()
if self.mode == "LOGIN" :
if len(chaine) > MAXLENMOT :
return False
for c in chaine :
if c not in CHARLOGIN :
return False
elif self.mode == "EMAIL" :
if len(chaine) > 60 :
return False
for c in chaine :
if c not in SS.CHAREMAIL :
return False
return True
def OnChar (self, event):
key = event.GetKeyCode()
if key < wx.WXK_SPACE or key == wx.WXK_DELETE or key > 255 :
event.Skip()
return
if self.mode == "LOGIN" and chr(key) in CHARLOGIN :
event.Skip()
return
if self.mode == "EMAIL" and chr(key) in CHAREMAIL :
event.Skip()
return
if not wx.Validator_IsSilent() :
wx.Bell()
# Returning without calling event.Skip() eats the event before it
# gets to the text control
return |