这行代码使程序对重启功能不起作用

2024-04-26 01:21:39 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Tags: ifisdefctypesforwardspeedturtlebet
1条回答
网友
1楼 · 发布于 2024-04-26 01:21:39

问题是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 winner\n\nYou win!")
        else:
            messagebox.showinfo("Result", "Blue is the winner\n\nYou lost")
    else:
        if bet == "green":
            messagebox.showinfo("Result", "Green is the winner\n\nYou win!")
        else:
            messagebox.showinfo("Result", "Green is the winner\n\nYou 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 winner\n\nYou win!")
        else:
            messagebox.showinfo("Result", "Blue is the winner\n\nYou lost")
    else:
        if bet == "green":
            messagebox.showinfo("Result", "Green is the winner\n\nYou win!")
        else:
            messagebox.showinfo("Result", "Green is the winner\n\nYou 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()

相关问题 更多 >