Это распространенная ошибка новичка при установке обработчиков событий:
window.onkeypress(paletka_1.paddle_a_up(), "w")
Вы не вызываете paddle_a_up
, вы хотите передать itдля вызова другого кода при возникновении события:
window.onkeypress(paletka_1.paddle_a_up, "w")
Попробуйте и посмотрите, будет ли он работать лучше для вас.Что касается остальной части вашего кода, у меня есть несколько предложений:
window.tracer(0)
Избегайте tracer()
и update()
, пока ваша программа не будет работать, иначе это только усложнит процесс разработки и отладки.Добавляйте их обратно только в том случае, если они вам нужны - если программа работает на ваше удовлетворение, не включайте их.
while True:
window.update()
Вместо этого этот цикл действительно должен быть вызовом mainloop()
, чтобы передать управление событию tkinter.обработчик:
window.mainloop()
Наличие переменных-членов и методов экземпляров с одинаковыми именами - плохая идея:
self.ball = turtle.Turtle()
...
def ball(self):
Как и весь Python, один перезаписывает другой, и случаются плохие вещи.Мои переработанные версии вашего кода:
main.py
from turtle import Screen
import elements
# Windows settings
window = Screen()
window.title("Pong game by Kosa")
window.bgcolor('black')
window.setup(width=800, height=600)
paletka_1 = elements.Objects()
window.onkeypress(paletka_1.paddle_a_up, "w")
window.listen()
window.mainloop()
elements.py
from turtle import Turtle
class Objects:
def __init__(self):
# Paddle A
self.paddle_a = Turtle("square")
self.init_paddle_a()
# Paddle B
self.paddle_b = Turtle("square")
self.init_paddle_b()
# Ball
self.ball = Turtle("square")
self.init_ball()
def init_paddle_a(self):
paddle_a_x = -350
self.paddle_a.speed('fastest')
self.paddle_a.shapesize(stretch_wid=5, stretch_len=1)
self.paddle_a.color('green')
self.paddle_a.penup()
self.paddle_a.setx(paddle_a_x)
def init_paddle_b(self):
paddle_b_x = 350
self.paddle_b.speed('fastest')
self.paddle_b.shapesize(stretch_wid=5, stretch_len=1)
self.paddle_b.color('red')
self.paddle_b.penup()
self.paddle_b.setx(paddle_b_x)
def init_ball(self):
self.ball.speed('fastest')
self.ball.color('white')
self.ball.penup()
self.ball.home()
def paddle_a_up(self):
y = self.paddle_a.ycor() + 20
self.paddle_a.sety(y)
def paddle_b_up(self):
y = self.paddle_b.ycor() + 20
self.paddle_b.sety(y)
Теперь должно появиться окно с веслами слева исправа и мяч посередине.Нажмите на окно и после того, как вы можете нажать «w», чтобы поднять левую лопасть.Теперь завершите программу!