Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

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,094 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

...