这是初学者在设置事件处理程序时常见的错误:
window.onkeypress(paletka_1.paddle_a_up(), "w")
你不想call paddle_a_up
, 你想要pass当事件发生时,它会调用其他一些代码:
window.onkeypress(paletka_1.paddle_a_up, "w")
尝试一下,看看它是否更适合您。就代码的其余部分而言,我有一些建议:
window.tracer(0)
Avoid tracer()
and 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()
元素.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”使左桨上升。现在完成程序!