Python - проблема с onkeypress () и listen () - PullRequest
0 голосов
/ 21 марта 2019

У меня проблема с одной функцией.Я использую Python 3.7, и когда я пытаюсь использовать функцию onkeypress(), ничего не происходит.Я пытаюсь проверить это, но модуль черепахи не реагирует, когда я нажимаю клавиши.

Я пытаюсь поднять весло с помощью клавиши «w».Но это не работает.Ниже приведены мои * .py файлы:

main.py

import elements
import turtle



#Windows settings

window = turtle.Screen()
window.title("Pong game by Kosa")
window.bgcolor('black')
window.setup(width=800, height=600)
window.tracer(0)

paletka_1 = elements.Objects()
paletka_1.paddle_a()





window.onkeypress(paletka_1.paddle_a_up(), "w")
window.listen()
while True:
    window.update()

elements.py

import turtle

class Objects:

    def __init__(self):
        #Paddle A

        #self.paddle_b = turtle.Turtle()


        # #Paddle B


        #Ball
        self.ball = turtle.Turtle()

    def paddle_a(self):

        paddle_a_x = -350
        #paddle_a_y = 0
        self.paddle_a = turtle.Turtle()
        self.paddle_a.speed(0)
        self.paddle_a.shape("square")
        self.paddle_a.shapesize(stretch_wid=5, stretch_len=1)
        self.paddle_a.color('green')
        self.paddle_a.penup()
        self.paddle_a.goto(paddle_a_x, 0)

    def paddle_b(self):
        paddle_b_x = -350
        paddle_b_y = 0

        self.paddle_b.speed(0)
        self.paddle_b.shape("square")
        self.paddle_b.shapesize(stretch_wid=5, stretch_len=1)
        self.paddle_b.color('green')
        self.paddle_b.penup()
        self.paddle_b.goto(paddle_b_x, paddle_b_y)

    def ball(self):
        self.ball.speed(0)
        self.ball.shape("square")
        self.ball.color('white')
        self.ball.penup()
        self.ball.goto(0, 0)

    def paddle_a_up(self):
        y = self.paddle_a.ycor()
        y += 20
        self.paddle_a.sety(y)
        print(y)

    def paddle_b_up(self):
        y = self.paddle_b.ycor()
        y += 20
        self.paddle_b.sety(y)

Что я получаю при запуске программы: я могу нажимать клавиши,но без изменений в моем весле.Можете ли вы найти мою ошибку?Я добавил print(y) в paddle_a_up() только для того, чтобы убедиться, что он работает.Я получаю результат print().

Это странно, потому что ошибки нет.

введите описание изображения здесь

1 Ответ

0 голосов
/ 21 марта 2019

Это распространенная ошибка новичка при установке обработчиков событий:

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», чтобы поднять левую лопасть.Теперь завершите программу!

enter image description here

...