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

Python Discussion :

Problème de variable d'une classe à une autre (grand débutant)


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2016
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2016
    Messages : 33
    Par défaut Problème de variable d'une classe à une autre (grand débutant)
    Bonjour je reprends python après 5 ans d'arrêt et je n'avais codé que des petits scripts de traitement de fichier. Pour m'attaquer aux classes j'ai décidé de m'attaquer à un logiciel novateur jamais encore porté un jeu de chistera............rien à voir avec un vulgaire pong...non,non rien à voir..

    J'ai un peu galéré, pas tout compris (surtout pas le rôle de self) mais le projet a avancé... la balle rebondi sur le fronton, la chistera se déplace sans soucis...sauf que...

    j'en arrive à la collision et la je me rend compte que passer une variable d'une classe à une autre n'est pas facile..pourtant à un moment ma balle doit bien savoir ou est ma chistera pour savoir si elle doit rebondir dessus. Après 200000 essais j'ai tenté de copier la solution d'un pong sur lequel je me base mais ca ne fonctionne pas...

    Si une bonne âme pouvais me dire comment passer une information d'une classe à une autre mais aussi pourquoi mon code ne fonctionne pas en l'état..

    merci..


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Traceback (most recent call last):
      File "peloteBasque.py", line 95, in <module>
        app = Fronton()
      File "peloteBasque.py", line 26, in __init__
        self.pel=Pelo(self.raq)
    TypeError: object() takes no parameters
    voici mon 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
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    #!/usr/bin/python3
    # -*- coding: UTF-8 -*-
     
    from tkinter import *
     
    class Fronton(Tk):
    	'''Application principale'''
    	def __init__(self):
    		'''constructeur'''
    		self.fen = Tk()
    		self.fen.title('Chistera')
     
    		self.can=Canvas(self.fen, width=600, height=600, bg="black")
    		self.can.grid(column=0,row=1,sticky="SW",columnspan=5)
     
    		self.bou_action = Button(self.fen)
    		self.bou_action.config(text='Nouvelle partie', command=self.action)
    		self.bou_action.grid(column=0,row=0,sticky="NW")
     
    		self.bou_quitter = Button(self.fen)
    		self.bou_quitter.config(text='Quitter', command=self.fen.destroy)
    		self.bou_quitter.grid(column=4,row=0,sticky="NE")
     
    		self.raq=Chis()
    		self.raq.rect(self.can)
    		self.pel=Pelo(self.raq)
    		self.pel.rond(self.can)
    		self.pel.move()
     
    	def run(self):
     
    		self.fen.mainloop()
     
     
    	def action(self):
    		self.lab = Label(self.fen)
    		self.lab.config(text='Bravo!!!')
     
    class Chis() :		
    	"""rien"""
    	def rect(self,canvas):
    		self.x1,self.y1,self.x2,self.y2=20,590,70,580
    		self.canvas=canvas
    		self.rect1=self.canvas.create_rectangle(self.x1,self.y1,self.x2,self.y2,fill="white")
    		canvas.bind_all("<Left>",self.mouv_left)
    		canvas.bind_all("<Right>", self.mouv_right)
     
    	def mouv_left(self, event) : 
    		"""mouvement raquette"""
    		if (self.x1>11) :
    			self.x1,self.x2=self.x1-10,self.x2-10
    			self.canvas.coords(self.rect1,self.x1,self.y1,self.x2,self.y2)
    	def mouv_right(self, event) :
    		"""mouvement raquette"""
    		if (self.x2<589) :
    			self.x1,self.x2=self.x1+10,self.x2+10
    			self.canvas.coords(self.rect1,self.x1,self.y1,self.x2,self.y2)
     
     
     
     
     
    class Pelo() :
    	def _init_(self, chis):
    		self.chis=chis
    	def rond(self,canvas):
    		self.x1,self.y1,self.x2,self.y2=0,0,10,10
    		self.canvas=canvas
    		self.rond1=self.canvas.create_oval(self.x1,self.y1,self.x2,self.y2,fill="white")
     
    	def move(self) :		
    		if (self.y2 > 595) :
    			self.dy=(-7)
    		elif (self.y1 < 5):
    			self.dy=7
    		if (self.x1<5):
    			self.dx=7
    		elif (self.x2 > 595) :
    			self.dx=(-7)
     
    		if (582<self.y2<590 and self.chis.x1<self.x2<self.chis.x2) :
    			self.dy=(-7)
     
    		self.x1=self.x1+self.dx
    		self.x2=self.x2+self.dx
    		self.y1=self.y1+self.dy
    		self.y2=self.y2+self.dy	
    		self.canvas.coords(self.rond1,self.x1,self.y1,self.x2,self.y2)
    		self.canvas.after(100,self.move)
     
     
     
     
    if __name__ == '__main__':
    	app = Fronton()
    	app.run()
    et voici le code à peine retouché sur lequel je me base
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
     
    from tkinter import *
    from random import randint
     
    class Fenetre(Tk):
        def __init__(self, width=600, height=400):
            Tk.__init__(self)
            self.flag = 0
     
            self.quit= Button(self,text="Quit Game",command=self.destroy)
            self.quit.grid(column=4,row=0,sticky="NE")
     
            self.new= Button(self,text="New Game",command=self.new_game)
            self.new.grid(column=0,row=0,sticky="NW")
     
     
            self.can = Canvas(self,width=width,height=height,bg="black")
            self.can.grid(column=0,row=1,sticky="SW",columnspan=5)
     
        def new_game(self):
            if self.flag == 0 :
                self.flag=1
                self.pads = Pad(self.can,self.flag)
                self.ball = Ball(self.can,self.pads,self.flag)
     
    class Pad:
        def __init__(self,canvas,flag):
            self.canvas = canvas
            self.flag = flag
            self.height = canvas.winfo_height()
            self.width = canvas.winfo_width()
            self.x1,self.y1 = 10,self.height/2-30
            self.x2,self.y2 = self.width-25,self.height/2-30
     
            self.Pad1 = canvas.create_rectangle(self.x1,self.y1,self.x1+15,self.y1+60,fill="white")
            self.Pad2 = canvas.create_rectangle(self.x2,self.y2,self.x2+15,self.y2+60,fill="white")
     
            canvas.bind_all("<Up>",self.mouv_up)
            canvas.bind_all("<Down>", self.mouv_down)
            self.dy2 = 25
            self.ia()
     
        def mouv_up(self,event):
            if self.y1>5 :
                self.y1=self.y1-10
                self.canvas.coords(self.Pad1,self.x1,self.y1,self.x1+15,self.y1+60)
     
        def mouv_down(self,event):
            if self.y1+60<(self.height-5):
                self.y1=self.y1+10
                self.canvas.coords(self.Pad1,self.x1,self.y1,self.x1+15,self.y1+60)
     
        def ia (self):
            self.y2=self.y2 + self.dy2
            if self.y2+60 > self.height-10 :
                self.dy2=-50
     
            if self.y2 < 5 :
                self.dy2=50
     
            self.canvas.coords(self.Pad2,self.x2,self.y2,self.x2+15,self.y2+60)
            if self.flag > 0:
                self.canvas.after(70,self.ia)
     
    class Ball:
        def __init__(self,canvas,pad,flag):
            self.canvas = canvas
            self.pad = pad
            self.height = canvas.winfo_height()
            self.width = canvas.winfo_width()
            self.flag = flag
            self.x1,self.y1 = self.width/2,self.height/2
            self.dx,self.dy = 30,30
            self.Ball = canvas.create_oval(self.x1, self.y1, self.x1+25, self.y1+25, width=2, fill='white')
            self.pointA, self.pointB = 0,0
     
            self.ready()
     
        def ready(self):
            self.starter=0
            self.score= Label(app,text="%d : %d" % (self.pointA,self.pointB), bg="black",fg="white")
            self.score.grid(column =2,row=0,sticky="S")
            self.x1,self.y1 = self.height/2,self.width/2
            app.titre = Label(app,text="PRESS ANY KEY TO START", bg="black",fg="white")
            app.titre.grid(column =2,row=2,sticky="S")
            self.canvas.bind_all("<Key>",self.start)
     
     
        def start(self,event):
            self.starter=1
            self.move()  
     
        def move(self):
            if self.starter==1:
                self.x1, self.y1 = self.x1 +self.dx, self.y1 + self.dy
     
                if self.y1 >self.height-26:
                    self.dx, self.dy = self.dx, -20
     
                if self.y1 <2:
                    self.dx, self.dy = self.dx, 20
     
                if self.x1 < self.pad.x1+20:
                    if self.pad.y1 < self.y1 < self.pad.y1+60:
                        self.dx, self.dy = 20, self.dy
     
                if self.x1+30 >  self.pad.x2-1:
                    if self.pad.y2<self.y1+12.5<self.pad.y2+60:
                         self.dx, self.dy = -20, self.dy
     
                if self.x1 < 0:
                    self.starter = 0
                    self.pointB = self.pointB+1
                    self.ready()
     
     
                if self.x1+25 > self.width:
                    self.starter=0
                    self.pointA = self.pointA+1
                    self.ready()
     
                self.canvas.coords(self.Ball,self.x1,self.y1,self.x1+30,self.y1+30)
                if self.flag > 0:
                    self.canvas.after(70,self.move)
     
     
     
    if __name__ == "__main__":
        app = Fenetre()
        app.mainloop()

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Ca m'étonnes pas que tu cherches longtemps, car c'est une erreur de frappe bien à la con que tu as faite.

    Le traceback te dit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      File "peloteBasque.py", line 26, in __init__
        self.pel=Pelo(self.raq)
    TypeError: object() takes no parameters
    Donc réflexe -> tu va voir la méthod __init__ de la class Pelo, et tu vérifie qu'elle prends bien en entrée un paramètre (en plus de celui d'office qui est self).
    Là tes yeux devraient à présent se poser autour de la ligne 64
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class Pelo() :
    	def _init_(self, chis):
    		self.chis=chis
    Dam ned, ça prends bien un paramètre (nommé chis). Pourquoi donc le compilateur ne le détecte t il pas ?
    Réponse : Parce qu'il ne tape sur cette méthode. Tu as nommé ta méthode _init_ et pas __init__ (avec double underscore de chaque côté), donc la méthode que tu as écrite n'est pas reconnue comme étant le constructeur de ta classe. Le compilateur en créer un par défaut qui est grosso modo
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def __init__(self) :
            pass
    qui permet de créer un objet, avec rien dedans. Ce qui explique l'erreur fourni par le Traceback, qui détecte que tu as fourni un paramètre alors qu'il n'en attends pas.

    A retenir donc : Le constructeur d'une classe c'est toujours __init__ avec 2 underscores de chaque côté !

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 742
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 742
    Par défaut
    Salut,

    Citation Envoyé par jojolemerou66 Voir le message
    Si une bonne âme pouvais me dire comment passer une information d'une classe à une autre mais aussi pourquoi mon code ne fonctionne pas en l'état..
    Votre code ne fonctionne pas parce que vous avez mal recopié __init__ et écrit _init_.
    Pour apprendre à construire des class avec Python, il y a des tutoriels.
    C'est sûr qu'après avoir soigneusement rangé son code dans des boîtes appelées "class" se pose la question d'échange d'informations. Mais ce n'est pas un sujet "Python" car il se pose pour tous les langages objets. Il se résout (en partie) via ce qu'on appelle patrons de conception (et la rubrique ALM).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2016
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2016
    Messages : 33
    Par défaut
    haha double bidule pour init....à retenir mettre les loupes pour coder .....merci à tous

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

Discussions similaires

  1. Ajouter une classe à une classe
    Par benooo dans le forum Débuter avec Java
    Réponses: 0
    Dernier message: 05/02/2014, 18h22
  2. Réponses: 8
    Dernier message: 19/10/2012, 19h15
  3. Une variable d'une classe à une autre.
    Par ApprentiOracle dans le forum Général Python
    Réponses: 3
    Dernier message: 06/03/2007, 14h36
  4. passage des variables d'une classe à une autre
    Par zibou7 dans le forum Langage
    Réponses: 4
    Dernier message: 19/02/2007, 16h46
  5. Passer une variable d'une classe à l'autre
    Par Gibou dans le forum C++
    Réponses: 2
    Dernier message: 16/06/2006, 08h38

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