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 :

Définition d'une classe (dérivée) et ajout de paramètre


Sujet :

wxPython

  1. #1
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 160
    Par défaut Définition d'une classe (dérivée) et ajout de paramètre
    Bonjour, désolé pour la question idiote que je vais poser mais je n'ai toujours pas saisi quelques détails conceptuels...

    Je veux créer ma classe MonFrame dérivée de wxFrame.
    Jusqu'à maintenant mon utilisation donnait cela et c'était suffisant car j'utilisais les valeurs par défaut pour les paramètres non déclarés:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class MonFrame(wx.Frame):
        def __init__(self,parent,id,title):
            wx.Frame.__init__(self,parent,id,title)
            self.parent = parent
    Maintenant, je voudrais ajouter un paramètre supplémentaire lors de ma définition ma nouvelle classe, autre que ceux d'origine donnés dans la doc :
    wxPanel(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL, const wxString& name = "panel")
    ).
    Dans la pratique, j'aimerai écrire quelque chose du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class MonFrame(wx.Frame):
        def __init__(self,parent,id,title, *lesAutresParamOrigine, nouveauParam="defaultValue"):
            wx.Frame.__init__(self,parent,id,title, *lesAutresParamOrigine)
            self.parent = parent
    A vrai dire j'ai essayé cela mais ca ne marche pas.
    Faut il alors que je redéclare tous les paramètres d'origine de Frame + mon "nouveauParamètre" ou est ce que je peux ajouter un truc du genre "*args, **kw", "nouveauParamètre".

    Pour ce que j'ai essayé de "*args, **kw", je n'ai pas de succès, mais je n'arrive pas à trouver d'infos claires sur l'utilisation de "*args, **kw"....
    Avez vous un, tutoriel à m'indiquer?

    J'ai trouvé juste un exemple détaillé ci dessous, je le comprends dans le cadre de l'exemple mais je ne sais pas, si et comment, on peut l'appliquer à la dérivation d'une classe avec ajout de paramètre.
    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
    here's a little example:
     
    >>> def f(a, *args, **kw):
    ...     print 'a:',a
    ...     print 'args:',args
    ...     print 'kw:',kw
    ...
    >>> f(1,2,3,x=4)
    a: 1
    args: (2, 3)
    kw: {'x': 4}
    >>> f(a=1,b=2,c=3)
    a: 1
    args: ()
    kw: {'c': 3, 'b': 2}
    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Par défaut
    si pour les autres paramètres d'origine, tu utilises toujours ceux par défaut, tu peux comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class MonFrame(wx.Frame):
        def __init__(self,parent,id,title, nouveauParam="defaultValue"):
            wx.Frame.__init__(self,parent,id,title)
            self.parent = parent
            .... ##traitement du nouveauParam

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 160
    Par défaut
    Merci en effet, ca marche. J'avais pourtant essayé sans succès.... mais quand on s'acharne trop, on ne fait rien de bien!!!

    Petite question complémentaire :
    comment omettre les paramètre placés "au milieu"

    Par exemple je n'ai pas besoin de déclarer le "ID" car je prends la valeur par défaut mais que je veux le "title" que je définis. J'ai essayé de ne rien mettre après la virgule mais ca ne marche pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class MonFrame(wx.Frame):
        def __init__(self,parent,,title, nouveauParam="defaultValue"):
            wx.Frame.__init__(self,parent,,title)
            self.parent = parent
            .... ##traitement du nouveauParam

  4. #4
    Membre Expert
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Par défaut
    Je pense que tu te mélanges les pinceaux entre les signatures de méthodes. La signature de ton __init__ peut être complètement différente de celle de la classe parente à partir du moment ou tu appelles la méthode __init__ de ta classe parente avec tout les paramètres attendus. Tu est entièrement libre à ce sujet.

    Exemple : __init__ avec juste <parent> et un paramètre à toi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class MonFrame(wx.Frame):
        def __init__(self, parent, nouveauParam=None):
            id = <une valeur>
            title = "mon titre'
            wx.Frame.__init__(self, parent, id, title)
            self.parent = parent
            if nouveauParam:
                <traitement de ton param>
    Pour passer un paramètres "directement", tu le passe en le nommant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def test(v, x = None, y = None):
        print v, x, y
     
     
    test(12, y=23)
    ou par un dictionnaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def test(v, x = None, y = None):
        print v, x, y
     
    d = {
        'y' : 34,
        }
     
    test(12, **d)
    L'avantage du dictionnaire c'est que tu peux construire une liste de paramètres complètement différentes entre 2 appels de méthode.

    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
    def test(v, x = None, y = None):
        print v, x, y
     
    d = {
        'v' : 12,
        'y' : 34,
        }
     
    test(**d)
     
    del d['y']
    d['v'] = 13
    d['x'] = 45
     
    test(**d)

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 160
    Par défaut
    Note: désolé, la doc citée plus haut est celle de Panel et je parle de Frame... c'est dur aujourd'hui!!!!

    La signature de ton __init__ peut être complètement différente de celle de la classe parente à partir du moment ou tu appelles la méthode __init__ de ta classe parente avec tout les paramètres attendus.
    ok, je crois que je comment à voir.

    Mais dans le cas de l'instanciation d'un wx.Panel classique (sans ajout de paramètre) , si je veux déclarer parent, id et.... size qui d'après la doc est entre position et style, je fais comment? Suis je obligé dans le wx.Frame.__init__ de déclarer le tout et dans ma définition de classe je ne déclare que parent, id et size ou il y a plus simple?
    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class MonPanel(wx.Panel):
        def __init__(self, parent, size=wx.defaultSize):
            id = <une valeur>
            title = "mon titre"
            pos=<une position>
            wx.Frame.__init__(self, parent, id, title, pos, size)
            self.parent = parent
            if nouveauParam:
                <traitement de ton param>

  6. #6
    Membre Expert
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Par défaut
    J'ai complété ma réponse précédente alors que tu avais déjà du la lire, revois là, je parle des paramètres nommés. Je pense que tu y trouveras la réponse.

  7. #7
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 160
    Par défaut
    Merci pour le complément d'exemple, je pense que ca rentre.

    En fait je pense que ma question vient du fait que je pensais que les paramètres pos, size...name donnés dans la doc était "nommés". Et donc que je pouvais instancier directement (avec le parent avant bien sur...) en mettant name="mon nom", pour garder les paramètres intermédiaires par défaut et donner un name voulu. Mais d'après ce que je comprends, ce n'est pas le cas. Ils ne sont nommés que si on les "nomme" dans le wx.Panel.__init__.

    Un jour, je comprendrais.....

  8. #8
    Membre Expert
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Par défaut
    Citation Envoyé par atalon1 Voir le message
    Merci pour le complément d'exemple, je pense que ca rentre.

    En fait je pense que ma question vient du fait que je pensais que les paramètres pos, size...name donnés dans la doc était "nommés". Et donc que je pouvais instancier directement (avec le parent avant bien sur...) en mettant name="mon nom", pour garder les paramètres intermédiaires par défaut et donner un name voulu. Mais d'après ce que je comprends, ce n'est pas le cas. Ils ne sont nommés que si on les "nomme" dans le wx.Panel.__init__.

    Un jour, je comprendrais.....
    Je suis pas sûr de comprendre ta remarque !!

    Tout les paramètres sont nommés, ce n'est que lors de l'appel de la fonction que l'on passe soit les paramètres dans l'ordre de déclaration, soit par leur nom.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def test(v, w):
        print v, w
     
    test(23, 231)
    test(w=121, v=12)
    résultat :Ici je déclare une fonction qui attend 2 paramètres v et w (ils sont nommés). Le premier appel passe les valeurs en fonction de l'ordre, v=23 et w=231, alors que le 2ième appel passe les valeurs non pas en fonction de l'ordre, mais en fonction du nom du paramètre.

  9. #9
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 160
    Par défaut
    Autant pour moi, tout est nommé et ca marche ; je vais me coucher....... ca ira mieux demain!!!!!

    voilà ce que je voulais faire, les deux exemples marchent. Désolé pour les dernière remarques dues vraisemblablement à la fatigue...

    Merci pour votre patience...

    exemple 1:
    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
    #!/usr/bin/python
    # -*- coding: iso-8859-1 -*-
     
    try:
        import wx
    except ImportError:
        raise ImportError,"The wxPython module is required to run this program"
     
    class simpleapp_wx():
        def __init__(self):
            self.frame = wx.Frame(None, -1, "myapp", size=(800, 600))
            self.frame.Show(True)
     
     
    if __name__ == "__main__":
        app = wx.App()
        frame = simpleapp_wx()
        app.MainLoop()
    exemple 2:
    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
    #!/usr/bin/python
    # -*- coding: iso-8859-1 -*-
     
    try:
        import wx
    except ImportError:
        raise ImportError,"The wxPython module is required to run this program"
     
    class simpleapp_wx(wx.Frame):
        def __init__(self,parent,id,title, size=(800, 600)):
            wx.Frame.__init__(self, parent,id,title, size=(800, 600))
            self.parent = parent
            self.Show(True)
     
    if __name__ == "__main__":
        app = wx.App()
        frame = simpleapp_wx(None,-1,'my application')
        app.MainLoop()

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 36
    Par défaut
    Citation Envoyé par atalon1 Voir le message
    Merci en effet, ca marche. J'avais pourtant essayé sans succès.... mais quand on s'acharne trop, on ne fait rien de bien!!!

    Petite question complémentaire :
    comment omettre les paramètre placés "au milieu"

    Par exemple je n'ai pas besoin de déclarer le "ID" car je prends la valeur par défaut mais que je veux le "title" que je définis. J'ai essayé de ne rien mettre après la virgule mais ca ne marche pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class MonFrame(wx.Frame):
        def __init__(self,parent,,title, nouveauParam="defaultValue"):
            wx.Frame.__init__(self,parent,,title)
            self.parent = parent
            .... ##traitement du nouveauParam
    Salut atalon1,

    Si tu veux utiliser le paramètre title sans renseigner le paramètre id, il suffit de mettre le nom du paramètre suivit de sa valeur. Sinon tu es obligé de mettre les valeurs dans l’ordre définit par la doc. Un petit exemple :
    wx.Frame.__init__(self,parent,title=title, pos = pos)
    Avec title et pos définit préalablement

    Cordialement
    Jean-Michel

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

Discussions similaires

  1. Définition d'une classe identique sauf pour un paramètre
    Par laurentSc dans le forum Mise en page CSS
    Réponses: 5
    Dernier message: 21/04/2008, 21h18
  2. problème d'accès dans une classe dérivée!
    Par chrono23 dans le forum C++
    Réponses: 47
    Dernier message: 10/10/2006, 11h22
  3. Réponses: 2
    Dernier message: 06/12/2005, 09h41
  4. Réponses: 4
    Dernier message: 20/11/2005, 05h48
  5. Déterminer le type d'une class dérivée
    Par LDDL dans le forum MFC
    Réponses: 3
    Dernier message: 10/12/2004, 17h36

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