Форум сайта python.su
Я новичок в программировании, поэтому обучаюсь по книге: R.Briggs.Python for kids - 2017. Дошёл до примера игры “Прыг-скок”. При запуске кода, программа выдаёт ошибку “TypeError: __init__() takes 3 positional arguments but 4 were given” в строке “ball = Ball(canvas, paddle,'red')”. Я понимаю, что строка ранее, а именно “paddle = Paddle(canvas, ‘blue’)” присваивает два аргумента для paddle, которые потом и передаются в аргументы переменной ball. Но что с этим сделать, не пойму. Ко всему прочему, программа запускается, мелькает и сразу закрывается. Python 3.7.4.
Прикреплённый файлы: Grafika_11.py (2,3 KБ)
Офлайн
from tkinter import * import random import time class Ball: def __init__(self, canvas, color): self.canvas = canvas self.paddle = paddle self.id = canvas.create_oval(10, 10, 25, 25, fill=color) self.canvas.move(self.id, 245, 100) starts = [-3, -2, -1, 1, 2, 3] random.shuffle(starts) self.x = starts[0] self.y = -3 self.canvas_height = self.canvas.winfo_height() self.canvas_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]: 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 = 3 if pos[3] >= self.canvas_height: self.y = -3 if pos[0] <= 0: self.x = 3 if pos[2] >= self.canvas_width: self.x = -3 class Paddle: def __init__(self, canvas, color): self.canvas = canvas self.id = canvas.create_rectangle(0, 0, 100, 10, fill=color) self.canvas.move(self.id, 200, 300) self.x = 0 self.canvas_width = self.canvas.winfo_width() self.canvas.bind_all('<KeyPress-Left>', self.turn_left) self.canvas.bind_all('<KeyPress-Right>', self.turn_right) 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 def turn_left(self, evt): self.x = -2 def turn_right(self, evt): self.x = 2 tk = Tk() tk.title("Игра") tk.resizable(0, 0) tk.wm_attributes("-topmost", 1) canvas = Canvas(tk, width=500, height=400, bd=0, highlightthickness=0) canvas.pack() tk.update() paddle = Paddle(canvas, 'blue') ball = Ball(canvas, paddle,'red') while 1: if ball.hit_bottom == False: ball.draw() paddle.draw() tk.update_idletasks() tk.update() time.sleep(0.01) mainloop()
Офлайн
канвас, колор
class Ball: def __init__(self, canvas, color):
ball = Ball(canvas, paddle, 'red')
Офлайн
FishHook
Сорри, ибо я в начале этого трудного пути, но в чём различие исходного кода и того что написали Вы? Я вижу те же строки, что и в исходнике. С ув.
Офлайн
Видимо страница 196 прям по центру
Офлайн
vlleonЯ ничего не писал, это ваш код и есть, просто вы очень долго мучались, но так и не осилили запостить код. Я вам помог. И ниже же показал где в вашем коде ошибка.
и того что написали Вы
Офлайн
FishHook
Где ошибка, я осознаю сам, я об этом написал в начальном тексте. Проблемка в том, как её исправить! Будь я поопытнее, я бы нашёл сам. А так приходиться унижаться в разделах для НОВИЧКОВ! С ув.
Офлайн
vlleon
Ну до трех то посчитать у вас хватает опыта?
Инициализатор класса принимает только два аргумента, а вы передаете ему три. Как исправить? Разобраться со своим собственным кодом и ответить на вопрос: нахрена вы передаете три аргумента в функцию, которая может принять только два.
class Ball:
def __init__(self, canvas (раз), color(два)):
ball = Ball(canvas(раз), paddle(два), ‘red’(три))
Отредактировано FishHook (Авг. 15, 2019 18:08:54)
Офлайн
Исправить класс Ball
class Ball: def __init__(self, canvas, paddle, color): self.canvas = canvas self.paddle = paddle
Офлайн
FishHook
Спасибо, большое! Код исправил, нашёл ещё ошибки в отсупах в итоге всё работает! Вот код:
from tkinter import *
import random
import time
class Ball:
def __init__(self, canvas, paddle, color):
self.canvas = canvas
self.paddle = paddle
self.id = canvas.create_oval(10, 10, 25, 25, fill=color)
self.canvas.move(self.id, 245, 100)
starts = [-3, -2, -1, 1, 2, 3]
random.shuffle(starts)
self.x = starts[0]
self.y = -3
self.canvas_height = self.canvas.winfo_height()
self.canvas_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]:
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 = 3
if pos[3] >= self.canvas_height:
self.y = -3
if pos[0] <= 0:
self.x = 3
if pos[2] >= self.canvas_width:
self.x = -3
class Paddle:
def __init__(self, canvas, color):
self.canvas = canvas
self.id = canvas.create_rectangle(0, 0, 100, 10, fill=color)
self.canvas.move(self.id, 200, 300)
self.x = 0
self.canvas_width = self.canvas.winfo_width()
self.canvas.bind_all('<KeyPress-Left>', self.turn_left)
self.canvas.bind_all('<KeyPress-Right>', self.turn_right)
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
def turn_left(self, evt):
self.x = -2
def turn_right(self, evt):
self.x = 2
tk = Tk()
tk.title("Игра")
tk.resizable(0, 0)
tk.wm_attributes("-topmost", 1)
canvas = Canvas(tk, width=500, height=400, bd=0, highlightthickness=0)
canvas.pack()
tk.update()
paddle = Paddle(canvas, 'blue')
ball = Ball(canvas, paddle, 'red')
while 1:
if ball.hit_bottom == False:
ball.draw()
paddle.draw()
tk.update_idletasks()
tk.update()
time.sleep(0.01)
mainloop()
Офлайн