Неясная проблема с кодом

Код не запускается. Ругается на это self.canvas.bind_all('<KeyPress-Right>', self.turn_right) self.canvas.bind_all('<KeyPress-Left>', self.turn_left) Просьба помочь понять причину.

import time
from tkinter import*
import random
from tkinter import font
tk = Tk()
tk.title('ball game from svg')
tk.resizable(0, 0)
tk.wm_attributes('-topmost', 1)
canvas = Canvas(tk, width=500, height=400, highlightthickness=0)
canvas.pack()
tk.update()
class Ball:
    def __init__(self, canvas, paddle, score, color):
        self.canvas = canvas
        self.padlle = paddle
        self.score = score
        self.id = canvas.create_oval(10,10, 25, 25, fill=color)
        self.canvas.move(self.id, 245, 100)
        starts = [-2, -1, 1, 2]
        random.shuffle(starts)
        self.x = starts[0]
        self.y = -2
        self.canvas_height = self.canvas.winfo_height()
        self.canvs_width = self.canvas.winfo_width()
        self.hit_bottom = False
        def hit_paddle(self, pos):
            paddle_pos = self.canvas.coords(self.paddle.id)
            if pos[2] >= paddle_pos[0] and pos[0] <= paddle_pos[2]:
                if pos[3] >= paddle_pos[1] and pos[3] <= paddle_pos[3]:
                    self.scorehit()
                    return True
                    return False
                    def draw(self):
                        self.canvas.move(self.id< self.x, self.y)
                        pos = self.canvas.coords(self.id)
                        if pos[1] <= 0:
                            self.y = 2
                            if pos[3] >= self.canvas_height:
                                self.hit_bottom = True
                                # хрень ане код, хотя магия всё равно будет
                                canvas.create.text(250, 120, text='Game OVER , man , GAME OVER!', font=('Consolas', 25), fill='red')
                                if self.hit_paddle(pos) == True:
                                    self.y = -2
                                    if pos[0] <= 0:
                                        self.x = 2
                                        if pos[2] >= self.canvas_width:
                                            self.x = -2
                                            # не трогать , тут все работает на черной магии!
class Paddle:
    def __init__(self, canvas, color):
        self.canvas = canvas
        self.id = canvas.create_rectangle(0, 0, 100, 10, fill=color)
        start_1 = [40, 60, 120, 150, 180, 200]
        random.shuffle(start_1)
        self.starting_point_x = start_1[0]
        self.canvas.move(self.id, self.starting_point_x, 300)
        self.x = 0
        self.canvas_width = self.canvas.winfo_width()
        self.canvas.bind_all('<KeyPress-Right>', self.turn_right)
        self.canvas.bind_all('<KeyPress-Left>', self.turn_left)
        self.started = False
        self.canvas.bind_all('<KeyPress-Return>', self.start_game)
    def turn_right(self, event):
        self.x = 2
        def turn_left(self, event):
            self.x = -2
            def start_game(self, event):
                self.started = True
                def draw(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.canvas_width:
                        self.x = 0
class Score:
    def __init__(self, canvas, color):
        self.score = 0
        self.canvas = canvas
        self.id = canvas.create_text(450, 10, text=self.score, font=('Consolas', 15), fill=color)
        def hit(self):
            self.score += 1
            self.canvas.itemconfig(self.id, text=self.score)
score = Score(canvas, 'green')
paddle = Paddle(canvas, 'White')
ball = Ball(canvas, paddle, score, 'red')
while not ball.hit_bottom:
    if paddle.started ==True:
        ball.draw()
        paddle.draw()
        tk.update_idlestack()
        tk.update
        time.sleep(0.01)
time.sleep(3)

Ответы (1 шт):

Автор решения: Сергей

Вот вам ваш код в более нормальном виде - проблема ушла заявленная. В исходном виде у него грубо сбиты все отступы, потому и не видит метод интепретатор. Он всё равно виснет, но это уже другая проблема вне рамок данного вопроса (открывать другим вопросом, если что). Проверьте, что ещё при копировании повредили.

Обратие внимание на подозрительное:

return True
return False

Возможно тут кусок потеряли, так как return False никогда не сработает.

А вот и сам код:

import time
from tkinter import*
import random
from tkinter import font
tk = Tk()
tk.title('ball game from svg')
tk.resizable(0, 0)
tk.wm_attributes('-topmost', 1)
canvas = Canvas(tk, width=500, height=400, highlightthickness=0)
canvas.pack()
tk.update()
class Ball:
    def __init__(self, canvas, paddle, score, color):
        self.canvas = canvas
        self.padlle = paddle
        self.score = score
        self.id = canvas.create_oval(10,10, 25, 25, fill=color)
        self.canvas.move(self.id, 245, 100)
        starts = [-2, -1, 1, 2]
        random.shuffle(starts)
        self.x = starts[0]
        self.y = -2
        self.canvas_height = self.canvas.winfo_height()
        self.canvs_width = self.canvas.winfo_width()
        self.hit_bottom = False
    def hit_paddle(self, pos):
        paddle_pos = self.canvas.coords(self.paddle.id)
        if pos[2] >= paddle_pos[0] and pos[0] <= paddle_pos[2]:
            if pos[3] >= paddle_pos[1] and pos[3] <= paddle_pos[3]:
                self.scorehit()
                return True
                return False
    def draw(self):
        self.canvas.move(self.id< self.x, self.y)
        pos = self.canvas.coords(self.id)
        if pos[1] <= 0:
            self.y = 2
            if pos[3] >= self.canvas_height:
                self.hit_bottom = True
                # хрень ане код, хотя магия всё равно будет
                canvas.create.text(250, 120, text='Game OVER , man , GAME OVER!', font=('Consolas', 25), fill='red')
                if self.hit_paddle(pos) == True:
                    self.y = -2
                    if pos[0] <= 0:
                        self.x = 2
                        if pos[2] >= self.canvas_width:
                            self.x = -2
                            # не трогать , тут все работает на черной магии!
class Paddle:
    def __init__(self, canvas, color):
        self.canvas = canvas
        self.id = canvas.create_rectangle(0, 0, 100, 10, fill=color)
        start_1 = [40, 60, 120, 150, 180, 200]
        random.shuffle(start_1)
        self.starting_point_x = start_1[0]
        self.canvas.move(self.id, self.starting_point_x, 300)
        self.x = 0
        self.canvas_width = self.canvas.winfo_width()
        self.canvas.bind_all('<KeyPress-Right>', self.turn_right)
        self.canvas.bind_all('<KeyPress-Left>', self.turn_left)
        self.started = False
        self.canvas.bind_all('<KeyPress-Return>', self.start_game)
    def turn_right(self, event):
        self.x = 2
    def turn_left(self, event):
        self.x = -2
    def start_game(self, event):
        self.started = True
    def draw(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.canvas_width:
            self.x = 0
class Score:
    def __init__(self, canvas, color):
        self.score = 0
        self.canvas = canvas
        self.id = canvas.create_text(450, 10, text=self.score, font=('Consolas', 15), fill=color)
    def hit(self):
        self.score += 1
        self.canvas.itemconfig(self.id, text=self.score)
score = Score(canvas, 'green')
paddle = Paddle(canvas, 'White')
ball = Ball(canvas, paddle, score, 'red')
while not ball.hit_bottom:
    if paddle.started ==True:
        ball.draw()
        paddle.draw()
        tk.update_idlestack()
        tk.update
        time.sleep(0.01)
time.sleep(3)
→ Ссылка