Python Turtle 中 onkeypress() 和 listen() 的问题
Problem with onkeypress() and listen() in Python Turtle
我有一个功能有问题。我使用 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()
.
的结果
很奇怪,因为没有错误。
这是初学者在设置事件处理程序时常犯的错误:
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)
现在应该放一个 window,左右两边有球拍,中间有一个球。点击 window 然后你可以按“w”让左边的桨升起。现在完成程序!
我有一个功能有问题。我使用 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()
.
很奇怪,因为没有错误。
这是初学者在设置事件处理程序时常犯的错误:
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)
现在应该放一个 window,左右两边有球拍,中间有一个球。点击 window 然后你可以按“w”让左边的桨升起。现在完成程序!