Python Turtle 中的 onkeypress() 和 Listen() 问题

问题描述 投票:0回答:1

我的一个功能有问题。我使用 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()

元素.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()
的结果。

很奇怪,因为没有错误。

enter image description here

python event-handling turtle-graphics python-turtle
1个回答
3
投票

这是初学者在设置事件处理程序时常见的错误:

window.onkeypress(paletka_1.paddle_a_up(), "w")

您不想call

paddle_a_up
,您想pass它以便在事件发生时调用其他代码:

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 的其他部分一样,其中一个会覆盖另一个,并且会发生不好的事情。我对您的代码进行了修改:

主.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()

元素.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”使左桨上升。现在完成程序!

© www.soinside.com 2019 - 2024. All rights reserved.