Неясная проблема с кодом
Код не запускается. Ругается на это 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)