我尝试用Python编写一个程序,让用户在龟赛中押注,并在比赛结束后告诉他是否猜对了。我希望用户能通过点击“r”来选择重新开始比赛(我使用了turtle.onkey方法),这一点也很顺利,直到我加入了下面这行代码:
bet = screen.textinput("Choose your bet", "Enter blue or green:")
现在程序允许用户像我想要的那样选择自己的押注,但是之后它就不会再响应任何.onkey方法了。有人知道为什么会发生这种情况吗?
bet = screen.textinput("Choose your bet", "Enter blue or green:")
现在程序允许用户像我想要的那样选择自己的押注,但是之后它就不会再响应任何.onkey方法了。有人知道为什么会发生这种情况吗?
import turtle
import random
import ctypes
speed = random.randint(0, 2)
myTurtle = turtle.Turtle()
myTurtle2 = turtle.Turtle()
screen = turtle.Screen()
def up():
myTurtle.setheading(90)
myTurtle.forward(10)
def down():
myTurtle.setheading(270)
myTurtle.forward(10)
def left():
myTurtle.setheading(180)
myTurtle.forward(10)
def right():
myTurtle.setheading(0)
myTurtle.forward(10)
def up2():
myTurtle2.setheading(90)
myTurtle2.forward(10)
def down2():
myTurtle2.setheading(270)
myTurtle2.forward(10)
def left2():
myTurtle2.setheading(180)
myTurtle2.forward(10)
def right2():
myTurtle2.setheading(0)
myTurtle2.forward(10)
def restart():
myTurtle.setposition(400, -300)
myTurtle.setheading(90)
myTurtle2.setposition(-400, -300)
myTurtle2.setheading(90)
speed = random.randint(0, 2)
bet = screen.textinput("Choose your bet", "Enter blue or green: ")
while myTurtle.ycor() < 300 and myTurtle2.ycor() < 300:
if speed == 1:
up()
elif speed == 2:
up2()
speed = random.randint(0, 2)
if myTurtle.ycor() == 300:
if bet == "blue":
ctypes.windll.user32.MessageBoxW(0, "Blue is the winner", "You win!", 0x00010000)
else:
ctypes.windll.user32.MessageBoxW(0, "Blue is the winner", "You lost", 0x00010000)
else:
if bet == "green":
ctypes.windll.user32.MessageBoxW(0, "Green is the winner", "You win!", 0x00010000)
else:
ctypes.windll.user32.MessageBoxW(0, "Green is the winner", "You lost", 0x00010000)
screen.title("Turtle race")
turtle.listen()
myTurtle.shape("turtle")
myTurtle2.shape("turtle")
myTurtle.setposition(400,-300)
myTurtle.setheading(90)
myTurtle2.setposition(-400,-300)
myTurtle2.setheading(90)
myTurtle.dot(10, "blue")
myTurtle2.dot(10, "green")
myTurtle.pencolor("blue")
myTurtle2.pencolor("green")
myTurtle.speed(0)
myTurtle2.speed(0)
bet = screen.textinput("Choose your bet", "Enter blue or green: ")
while myTurtle.ycor() < 300 and myTurtle2.ycor() < 300:
if speed == 1:
up()
elif speed == 2:
up2()
speed = random.randint(0, 2)
if myTurtle.ycor() == 300:
if bet == "blue":
ctypes.windll.user32.MessageBoxW(0, "Blue is the winner", "You win!", 0x00010000)
else:
ctypes.windll.user32.MessageBoxW(0, "Blue is the winner", "You lost", 0x00010000)
else:
if bet == "green":
ctypes.windll.user32.MessageBoxW(0, "Green is the winner", "You win!", 0x00010000)
else:
ctypes.windll.user32.MessageBoxW(0, "Green is the winner", "You lost", 0x00010000)
turtle.onkey(up, 'Up')
turtle.onkey(down, 'Down')
turtle.onkey(left, 'Left')
turtle.onkey(right, 'Right')
turtle.onkey(restart, 'r')
turtle.onkey(up2, 'w')
turtle.onkey(down2, 's')
turtle.onkey(left2, 'a')
turtle.onkey(right2, 'd')
turtle.mainloop()
while
循环一直运行并阻塞了mainloop()
,而mainloop()
负责获取系统的键盘/鼠标事件并检查是否点击了r
并执行相应的函数。这时候需要使用 ontimer 代替while
来定期重复执行函数,以避免阻塞mainloop()
。 - furasonkey()
之后需要添加listen()
才能访问系统中的按键。 - furas