【问题标题】:Problem with onkeypress() and listen() in Python TurtlePython Turtle 中的 onkeypress() 和 listen() 问题
【发布时间】:2019-03-20 22:00:28
【问题描述】:

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

程序启动时我得到的结果:我可以按键,但我的桨没有变化。你能找出我的错误吗?我在paddle_a_up() 中添加了print(y),只是为了确保它有效。我得到print() 的结果。

很奇怪,因为没有错误。

【问题讨论】:

    标签: python event-handling turtle-graphics


    【解决方案1】:

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

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

    这个循环实际上应该是对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”使左桨上升。现在完成程序!

    【讨论】:

      猜你喜欢
      • 2021-10-29
      • 1970-01-01
      • 2020-08-29
      • 1970-01-01
      • 2022-11-25
      • 1970-01-01
      • 2019-03-24
      • 1970-01-01
      • 2021-03-03
      相关资源
      最近更新 更多