如果 while 循环处于活动状态,海龟图形不响应 onkey() 命令

我正在尝试制作一个游戏,其中海龟需要能够注册并响应用户输入(简化,将出现一个字母,用户需要在键盘上单击它。因此,如果它显示“b”,则用户键入“乙”)。我只添加了字母 a 到 f 以使其在测试过程中更简单。它们中的每一个都有一个函数,该函数将在按下字母并且程序正在侦听它时执行。


一切都很好,直到我添加了一个 while 函数。目前,while 函数中没有任何内容(除了 pass),但是在我创建它之后,代码将不再响应用户输入。有人能告诉我如何解决这个问题吗?我的最终目标是让程序在 while 循环运行并执行其代码时始终侦听用户输入。下面是我当前的代码


import signal, turtle


def timeout_handler(signal, frame): # End of timer function

    raise Exception('Time is up!')


signal.signal(signal.SIGALRM, timeout_handler)

signal.alarm(10) # Number inside is how long the game will last.


def hit_a():

    print("a registered")

def hit_b():

    print("b registered")

def hit_c():

    print("c registered")

def hit_d():

    print("d registered")

def hit_e():

    print("e registered")

def hit_f():

    print("f registered")


turtle.onkey(hit_a, "a")

turtle.onkey(hit_b, "b")

turtle.onkey(hit_c, "c")

turtle.onkey(hit_d, "d")

turtle.onkey(hit_e, "e")

turtle.onkey(hit_f, "f")

turtle.listen()



while True:

    pass

    # Add program here

turtle.mainloop()

编辑:我需要一段代码,或者至少需要一个循环来保持部分重复。在伪代码中它看起来像这样:


Several turtles each write one letter somewhere on the screen

Program waits for user to input a letter

Award/deduct points based on if they got it right or wrong

go back to line 2 if they got it wrong.

repeat

我计划添加更多内容,但我首先需要让基础游戏继续运行。我知道如何编码的唯一方法是使用 while 循环。但是使用一个似乎是不可能的,因为它会阻止程序监听用户输入。请注意,我需要所有这些都在海龟上,而不是在终端上(如果在 Windows 上,则为命令提示符)因为我将对字母进行颜色编码以显示要避免的字母和要输入的字母。我应该怎么写这个?


我也想快速提一下,我之前已经“避免”了这个问题。在下面的代码中,程序在 while 循环中响应用户输入。(忽略问题和分配给 onkey() 的函数。这个想法是程序在循环中响应)。但是,我不知道为什么在这段代码中程序在循环中响应,但在上面的代码中它没有注册任何用户输入


turtle.onkey(lower_game1_number, "s")

turtle.onkey(increase_game1_number, "w")

turtle.listen(xdummy=None, ydummy=None)


while True: # game1 is a turtle

    game1.write(first_game_num_display,False,"center",("Arial",30))

    game1_timer = random.randint(2,4)

    time.sleep(game1_timer)

    increase_game1_number()

    game1.undo()

    print(game1_timer)



mainloop()


眼眸繁星
浏览 210回答 1
1回答

慕无忌1623718

除了while True:@martineau 提供的“永远不要在基于事件的环境中使用”建议之外,您无需将“信号”库拖到代码中,因为您可以使用ontimer()事件处理它。我需要一段代码,或者至少需要一个循环来保持一个部分的重复。为了解决这个问题,我用一个简单的游戏替换了我之前的示例代码,该游戏显示一个字母,并会不断在屏幕上移动它并每两秒改变它的颜色,直到您输入该字母。之后,它将更改为不同的字母并继续:from turtle import Screen, Turtlefrom random import shuffle, randrangefrom itertools import cycleWIDTH, HEIGHT = 600, 600FONT_SIZE = 36FONT = ('Arial', FONT_SIZE, 'bold')LETTERS = list("abcdefghijklmnopqrstuvwxyz")COLORS = ['red', 'blue', 'green', 'magenta', 'cyan', 'black', 'orange', 'gray']def play():    global letter    if hit == letter:        letter = next(letters)    turtle.clear()    turtle.color(next(colors))    turtle.goto(randrange(FONT_SIZE - WIDTH/2, WIDTH/2 - FONT_SIZE), randrange(FONT_SIZE - HEIGHT/2, HEIGHT/2 - FONT_SIZE))    turtle.write(letter, font=FONT)    screen.ontimer(play, 2000)letters = LETTERSshuffle(letters)letters = cycle(letters)letter = next(letters)colors = COLORSshuffle(colors)colors = cycle(colors)hit = Nonescreen = Screen()screen.setup(WIDTH, HEIGHT)turtle = Turtle(visible=False)turtle.penup()for character in LETTERS:    def hit_character(character=character):        global hit        hit = character    screen.onkey(hit_character, character)screen.listen()play()screen.mainloop()确保在输入之前单击窗口以使其侦听输入。希望这会给你一些想法,如何在不使用while True:循环的情况下解决更复杂的问题。或者至少向您展示如何设置所有onkey()事件分配和处理程序,而无需为字母表中的每个字母重写相同的代码......
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python