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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : 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"))
Ce code n'engendre pas d'avertissement :
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"))
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
self.login = wx.TextCtrl(self, -1, "", validator=MyValidator("LOGIN"))
par:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : 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