这行代码使程序对重新启动函数不起作用



我试图用python编写一个程序,让用户在其中一只乌龟上下注,比赛结束后告诉他是否正确。我想让用户通过点击"r"来选择是否要重新开始比赛(我使用了turtle.onkey方法(,它一直很好,直到我放了这行代码:bet=screen.textinput("选择您的赌注","输入蓝色或绿色:"(。现在这个程序让用户像我想的那样选择他的赌注,但当按下"r"时它不会做出反应。。我想澄清的是,在代码的textinput行之后,程序不会对任何.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()

问题是onkey需要将焦点集中在主窗口上才能从系统中获取密钥,但当您执行textinput时,该焦点将丢失,它需要再次使用screen.listen()


最小工作代码。

因为您在restart()内部和restart()外部重复一些代码,所以我运行restart()而不是外部代码。

因为我不使用Windows,所以我使用tkinter.messagebox来显示消息。turtle已经使用tkinter来显示带有画布和textinput的主窗口。

import turtle
import random
#import tkinter  as tk
from tkinter import messagebox
# functions ---
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: ")
screen.listen()  # <--- set focus on main window after `textinput`

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":
messagebox.showinfo("Result", "Blue is the winnernnYou win!")
else:
messagebox.showinfo("Result", "Blue is the winnernnYou lost")
else:
if bet == "green":
messagebox.showinfo("Result", "Green is the winnernnYou win!")
else:
messagebox.showinfo("Result", "Green is the winnernnYou lost")

# --- main ---
speed = random.randint(0, 2)
myTurtle  = turtle.Turtle()
myTurtle2 = turtle.Turtle()
screen = turtle.Screen()
screen.title("Turtle race")
myTurtle.shape("turtle")
myTurtle2.shape("turtle")
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')
restart()
turtle.mainloop()

编辑:

简化代码-我把海龟放在列表上,以后我可以使用myTurtles[number],我可以使用一个函数up(number),而不是两个函数up()up2()

import turtle
import random
from tkinter import messagebox
# functions ---
def up(number):
myTurtles[number].setheading(90)
myTurtles[number].forward(10)
def down(number):
myTurtles[number].setheading(270)
myTurtles[number].forward(10)
def left(number):
myTurtles[number].setheading(180)
myTurtles[number].forward(10)
def right(number):
myTurtles[number].setheading(0)
myTurtles[number].forward(10)
def restart():

myTurtles[0].setposition(400, -300)
myTurtles[0].setheading(90)
myTurtles[1].setposition(-400, -300)
myTurtles[1].setheading(90)

bet = screen.textinput("Choose your bet", "Enter blue or green: ")
screen.listen()

speed = random.randint(0, 2)
while myTurtles[0].ycor() < 300 and myTurtles[0].ycor() < 300:
if speed < 2: # randint(0, 2) can gives 0, 1, 2  
up(speed)
speed = random.randint(0, 2)
if myTurtles[0].ycor() == 300:
if bet == "blue":
messagebox.showinfo("Result", "Blue is the winnernnYou win!")
else:
messagebox.showinfo("Result", "Blue is the winnernnYou lost")
else:
if bet == "green":
messagebox.showinfo("Result", "Green is the winnernnYou win!")
else:
messagebox.showinfo("Result", "Green is the winnernnYou lost")

# --- main ---
screen = turtle.Screen()
screen.title("Turtle race")
myTurtles = [
turtle.Turtle(),
turtle.Turtle(),
]    
myTurtles[0].shape("turtle")
myTurtles[1].shape("turtle")
turtle.onkey(lambda: up(0),    'Up')
turtle.onkey(lambda: down(0),  'Down')
turtle.onkey(lambda: left(0),  'Left')
turtle.onkey(lambda: right(0), 'Right')
turtle.onkey(lambda: up(1),    'w')
turtle.onkey(lambda: down(1),  's')
turtle.onkey(lambda: left(1),  'a')
turtle.onkey(lambda: right(1), 'd')
turtle.onkey(restart, 'r')
restart()
turtle.mainloop()

最新更新