IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

wxPython Discussion :

PyValidator [Pythonw warning: Could not transfer data to window]


Sujet :

wxPython

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 71
    Points : 56
    Points
    56
    Par défaut 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 : 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

  2. #2
    Membre expérimenté Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    salut,

    elle est où la question?
    "Etre conscient de la difficulté permet de l'éviter.."
    Lao-Tseu.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 71
    Points : 56
    Points
    56
    Par défaut

    Je voudrais simplement savoir comment faire pour que ce message d'avertissement disparaisse. Il ne sert à rien de mon point de vue, puisque tout fonctionne normalement, sauf l'apparition indésirable de ce message...
    Par ailleurs, je ne vois pas ce qu'il n'arrive pas à transférer...

  4. #4
    Membre expérimenté Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    les validator servent à valider les données contenues dans les widgets (jusque là , normale) mais ils servent aussi à tranferer des données dans celles-ci à l'ouverture et à la fermeture de la fenêtre les contenant, via les methodes TransfertToWindow et TransfertFromWindow du validator.
    Il te suffit de rajouter à ta definition de classe validator:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        def TransferToWindow(self):
            return True
     
        def TransfertFromWindow(self):
            return True
    "Etre conscient de la difficulté permet de l'éviter.."
    Lao-Tseu.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 71
    Points : 56
    Points
    56
    Par défaut
    Oui, ça fonctionne.
    Merci beaucoup pour votre aide!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 10/04/2014, 13h29
  2. [WS 2008] 425 could not open data connection to port
    Par oufaraj dans le forum Windows Serveur
    Réponses: 1
    Dernier message: 24/05/2013, 09h48
  3. [2008] Pipeline Warning: Could not open global shared memory
    Par Rymaya dans le forum SSIS
    Réponses: 3
    Dernier message: 01/04/2011, 14h35
  4. Réponses: 2
    Dernier message: 17/06/2010, 09h54
  5. Gtk-WARNING **: Could not find signal handler
    Par yostane dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 24/11/2008, 15h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo