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

Tkinter Python Discussion :

Dériver la classe Tkinter.Canvas


Sujet :

Tkinter Python

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 93
    Points : 99
    Points
    99
    Par défaut Dériver la classe Tkinter.Canvas
    Bonjour à tous,
    J'écris un programme de simulation d'une population d'organismes (très basique). Un organisme évolue dans une zone (hauteur et largeur définies) qui restreint ses déplacements. J'ai l'intention de faire une classe Zone dérivée de Tkinter.Canvas. Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    1.import Tkinter as tk
    2.class Zone(tk.Canvas):
    3.    def __init__(self, master, hauteur, largeur, couleur):
    4.        self.master = master  #fenêtre maîtresse
    5.        self.largeur, self.hauteur = largeur, hauteur
    6.        self.organismes = []  #collection d'organismes évoluant dans la zone
    7.        #appel du constructeur de la classe mère
    8.        super(Zone, self).__init__(self.master, width=largeur, height=hauteur, bg=couleur)
    L'appel de super ne fonctionne pas : tel que je l'ai écrit, la classe mère devrait hériter de la classe object, ce qui ne semble pas être le cas.
    J'ai trouvé un tour de passe-passe qui fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    1.import Tkinter as tk
    1.class Canvas(tk.Canvas, object)
    2.    pass
    3.
    4.class Zone(Canvas):
    5.    def __init__(self, master, hauteur, largeur, couleur):
    6.        self.master = master  #fenêtre maîtresse
    7.        self.largeur, self.hauteur = largeur, hauteur
    8.        self.organismes = []  #collection d'organismes évoluant dans la zone
    9.        #appel du constructeur de la classe mère
    10.       super(Zone, self).__init__(self.master, width=largeur, height=hauteur, bg=couleur)
    Comme ma classe Canvas "personnelle" hérite de la classe object, mon appel à super fonctionne.

    Je vous embête juste pour savoir s'il existe une manière d'appeler la classe mère sans qu'elle n'hérite d'object, et sans faire ma petite bidouille.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 93
    Points : 81
    Points
    81
    Par défaut cela peu t aidez
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    from Tkinter import*
    class test(Canvas):
        def __init__(self):
            self.root=Tk()
            self.root.mainloop()
     
            super(test)
     
     
    test()

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 93
    Points : 81
    Points
    81
    Par défaut un autre code
    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
     
    class A:
        def __init__(self):
            print 'A'
     
    class B(A):
        def __init__(self):
            super(type(B),A).__init__(type(B)) 
            print 'B'
     
    def main():
        b = B()
     
    if __name__ == '__main__':
        main()

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 93
    Points : 81
    Points
    81
    Par défaut voila je coix que ca peu marcher
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    from Tkinter import Canvas
    class Zone(Canvas):
        def __init__(self, master, hauteur, largeur, couleur):
            self.master = master  #fenêtre maîtresse
            self.largeur, self.hauteur = largeur, hauteur
            self.organismes = []  #collection d'organismes évoluant dans la zone
            #appel du constructeur de la classe mère
            super(type(Zone),Canvas).__init__(type(Zone),self.master, width=largeur, height=hauteur, bg=couleur)

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 93
    Points : 81
    Points
    81
    Par défaut ca y est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    from Tkinter import*
    class Zone(Canvas):
        def __init__(self, master, hauteur, largeur, couleur):
            self.canvas=Canvas(master,height=hauteur,width=largeur,bg=couleur)
            self.canvas.pack()
            self.organismes = []  #collection d'organismes évoluant dans la zone
            #appel du constructeur de la classe mère
            super(type(Zone),Canvas).__init__(type(Zone))
    if __name__=='__main__':
        root=Tk()
        z=Zone(root,200,200,"#AAAAAA")
        root.mainloop()

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 93
    Points : 81
    Points
    81
    Par défaut apres quelques heures je crois qu ont s approche de la solution
    [code]

    from Tkinter import*
    class canvas2(object):
    def __init__(self,master,largeur,hauteur,couleur):

    self.c=Canvas(master,width=largeur,height=hauteur,background=couleur);self.c.pack();self.c.mainloop()

    class Zone(canvas2):
    def __init__(self,master,largeur,hauteur,couleur):

    self.organismes = [] #collection d'organismes évoluant dans la zone
    #appel du constructeur de la classe mère
    super(Zone,self).__init__(master,largeur,hauteur,couleur)
    if __name__=='__main__':
    root=Tk()
    z=Zone(root,200,200,"#ABCDEF")
    z.__init__(root,200,200,"#ABCDEF")
    [code]

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 93
    Points : 81
    Points
    81
    Par défaut voili voilou voila
    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
     
    from Tkinter import*
    class canvas2(object):
        def __init__(self,master,largeur,hauteur,couleur):
     
            self.c=Canvas(master,width=largeur,height=hauteur,background=couleur);self.c.pack()
     
    class Zone(canvas2):
        def __init__(self,master,largeur,hauteur,couleur):
     
            self.organismes = []  #collection d'organismes évoluant dans la zone
            #appel du constructeur de la classe mère
            super(Zone,self).__init__(master,largeur,hauteur,couleur)
    if __name__=='__main__':
        root=Tk()
        z=Zone(root,200,200,"#ABCDEF")
        #Zone.__init__(root,200,200,"#ABCDEF")
        root.mainloop()

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 93
    Points : 99
    Points
    99
    Par défaut
    Merci goomie ! Je ne me suis finalement pas embêté : j'ai supprimé ma classe Canvas intermédiaire, et j'ai opéré comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    1. import Tkinter as tk
    2. class Zone(tk.Canvas):
    3.     def __init__(self, master, w=None, h=None, bg=None):
    4.         tk.Canvas.__init__(self, master, width=w, height=h, bg=bg)
    ...
    Je cherchais juste à utiliser 'super' comme en Java en fait, sans mentionner le nom de la classe supérieure, ni devoir modifier celle-ci ou créer une classe intermédiaire. Une telle utilisation n'est pas encore possible, mais l'équipe de développement de Python y travaille pour une future version ;-)

    A++

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 10/09/2006, 11h58
  2. [Tkinter].... Canvas: effacer un objet
    Par airod dans le forum Tkinter
    Réponses: 1
    Dernier message: 23/01/2006, 12h55
  3. [VB.NET] Dériver la classe Button
    Par toniolol dans le forum Windows Forms
    Réponses: 4
    Dernier message: 20/12/2005, 09h48
  4. [Tkinter] Canvas -> superposition et z-index ?
    Par Olivier_ dans le forum Tkinter
    Réponses: 3
    Dernier message: 02/12/2005, 09h05
  5. Dériver la classe TDataSet
    Par Bruno75 dans le forum Bases de données
    Réponses: 12
    Dernier message: 07/03/2005, 14h21

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