AttributeError: 'Raquette' object has no attribute 'canevas'

+4 votes

J'ai mis cela comme code :

from tkinter import *
import random
import time

class Balle:
    def __init__(self, canvas, raquette, couleur):
        self.canvas = canvas
        self.raquette = raquette
        self.id = canvas.create_oval(10, 10, 25, 25, fill=couleur)
        self.canvas.move(self.id, 245, 100)
        departs = [-3, -2, -1, 1, 2, 3]
        random.shuffle(departs)
        self.x = departs[0]
        self.y = -3
        self.hauteur_canevas = self.canvas.winfo_height()
        self.largeur_canevas = self.canvas.winfo_width()
        self.touche_bas = False

    def heurter_raquette(self, pos):
        pos_raquette = self.canvas.coords(self.raquette.id)
        if pos[2] >= pos_raquette[0] and pos[0] <= pos_raquette[2]:
            if pos[3] >= pos_raquette[1] and pos[3] <= pos_raquette[3]:
                return True
            return False


    def dessiner(self):
        self.canvas.move(self.id, self.x, self.y)
        pos = self.canvas.coords(self.id)
        if pos[1] <= 0:
            self.y = 3
        if pos[3] >= self.hauteur_canevas:
            self.tuche_bas = True
        if self.heurter_raquette(pos) == True:
            self.y = -3
        if pos[0] <= 0:
            self.x = 3
        if pos[2] >= self.largeur_canevas:
            self.x = -3

class Raquette:
    def __init__(self, canvas, couleur):
        self.canvas = canvas
        self.id = canvas.create_rectangle(0, 0, 100, 10, fill=couleur)
        self.canvas.move(self.id, 200, 300)
        self.x = 0
        self.largeur_canevas = self.canevas.winfo_width()
        self.canvas.bind_all('<KeyPress-Left>', self.vers_gauche)
        self.canvas.bind_all('<KeyPress-Right>', self.vers_droite)

    def vers_gauche(self, evt):
        self.x = -2

    def vers_droite(self, evt):
        self.x = 2

    def dessiner(self):
        self.canvas.move(self.id, self.x, 0)
        pos = self.canvas.coords(self.id)
        if pos[0] <= 0:
            self.x = 0
        elif pos[2] >= self.largeur_canevas:
            self.x = 0

tk = Tk ()
tk.title("Jeu")
tk.resizable(0, 0)
tk.wm_attributes("-topmost", 1)
canvas = Canvas(tk, width=500, height=400, bd=0, highlightthickness=0)
canvas.pack()
tk.update()

raquette = Raquette(canvas, 'blue')
balle = Balle(canvas, raquette, 'red')

while 1:
    if balle.touche_bas == False:
        balle.dessiner()
        raquette.dessiner()
    balle.dessiner()
    raquette.dessiner
    tk.update_idletasks()
    tk.update()
    time.sleep(0.01)

Pourquoi j'obtiens AttributeError: 'Raquette' object has no attribute 'canevas' et comment réparer ?

demandé 23-Jan-2016 par anonyme
edité 23-Jan-2016 par max

ça serait bien de mettre ta stacktrace pour plus d'infos.

Comme te l'a expliqué boblinux, la réponse à la question est explicitement indiquée dans le message d'erreur, avec le numéro de ligne en +. Que demande le peuple

2 Réponses

+6 votes
 
Meilleure réponse

J'ai exécuté ton code, le code erreur est le suivant :

Traceback (most recent call last):
  File "tk_ie.py", line 73, in <module>
    raquette = Raquette(canvas, 'blue')
  File "tk_ie.py", line 47, in __init__
    self.largeur_canevas = self.canevas.winfo_width()
AttributeError: 'Raquette' object has no attribute 'canevas'

Donc c'est bien cette ligne qui foire :

 self.largeur_canevas = self.canevas.winfo_width()

En effet, en anglais "canevas" = "canvas", donc il suffisait juste d'enlever ton "e" du mot "canevas".

Sinon sympa ton petit jeu de baballe ;)

répondu 23-Jan-2016 par boblinux (3,092 points)
sélectionné 11-Fev-2016 par boblinux

Le pb des posts anonymes, les réponses jamais validées :-(

Mais que d'upvotes !

@fox
bah autant les valider à la main si on est sûr que c'est la réponse (bon je pense qu'ici il n'y aura pas d'ambiguïtés, enfin quoi que ;p )

+3 votes

Dans le constructeur de Raquette :

self.largeur_canevas = self.canevas.winfo_width()

Ce devrait être self.canvas et pas canEvas

répondu 23-Jan-2016 par noobien (158 points)

ups j'crois qu'on a répondu en parallèle :p

...