Python-onkeypress()和listen()的问题

时间:2019-03-20 22:00:28

标签: python event-handling turtle-graphics

我对一个功能有疑问。我使用的是Python 3.7,当我尝试使用onkeypress()函数时,没有任何反应。我尝试对其进行检查,但是当我按下按键时,turtle模块没有反应。

我尝试使用'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()的结果。

这很奇怪,因为没有错误。

enter image description here

1 个答案:

答案 0 :(得分:0)

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

[1] "Equality of unscaled variance-covariance-matrix:"
[1] TRUE
[1] "Equality of variance-covariance matrix scaled by `dispersion`:"
[1] FALSE
       Estimate Std. Error   z value   Pr(>|z|)
[1,] -0.3726848  0.1959110 -1.902317 0.05712978
[2,]  0.5887384  0.2721666  2.163155 0.03052930
[3,]  0.3161643  0.2352180  1.344133 0.17890528
       Estimate Std. Error   t value   Pr(>|t|)
[1,] -0.3726848  0.1886017 -1.976042 0.05099072
[2,]  0.5887384  0.2620122  2.246988 0.02690735
[3,]  0.3161643  0.2264421  1.396226 0.16583365

您不想调用 window.onkeypress(paletka_1.paddle_a_up(), "w") ,而是想传递该事件,以便在事件发生时调用其他代码:

paddle_a_up

尝试一下,看看它是否对您更好。至于其余的代码,我有一些建议:

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

在程序运行之前,请避免使用window.tracer(0) tracer(),否则会使开发和调试过程变得复杂。仅在需要时再添加它们-如果程序令人满意,请不要添加它们。

update()

实际上,此循环应该是对while True: window.update() 的调用,以将控制权移交给tkinter的事件处理程序:

mainloop()

具有相同名称的成员变量和实例方法不是一个好主意:

window.mainloop()

就像Python的其余部分一样,一个会覆盖另一个,并且会发生不好的事情。我的代码重做版本:

main.py

self.ball = turtle.Turtle()
...
def ball(self):

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

现在这应该会建立一个窗口,左右分别带有桨,中间还有一个球。单击窗口,然后您可以按“ w”使左桨上升。现在完成程序!

enter image description here