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 :
On clique sur OK puis la boite de dialogue apparaît et fonctionne normalement, même les validateurs.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3Pythonw warning Could not transfer data to window
Le code suivant engendre l'avertissement ci-dessus :
Ce code n'engendre pas d'avertissement :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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"))
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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"))
Autre constatation : il semble bien que les validateurs n'aiment pas fonctionner avec wx.Dialog, car si je remplace, dans la classe InscriptionDialog :
par:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 self.login = wx.TextCtrl(self, -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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 self.login = wx.TextCtrl(mainwindow, -1, "", validator=MyValidator("LOGIN"))
Voici la classe MyValidator :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Partager