为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

眼眸繁星 2021-11-16 10:43:52
我正在尝试制作一个游戏,其中海龟需要能够注册并响应用户输入(简化,将出现一个字母,用户需要在键盘上单击它。因此,如果它显示“b”,则用户键入“乙”)。我只添加了字母 a 到 f 以使其在测试过程中更简单。它们中的每一个都有一个函数,该函数将在按下字母并且程序正在侦听它时执行。一切都很好,直到我添加了一个 while 函数。目前,while 函数中没有任何内容(除了 pass),但是在我创建它之后,代码将不再响应用户输入。有人能告诉我如何解决这个问题吗?我的最终目标是让程序在 while 循环运行并执行其代码时始终侦听用户输入。下面是我当前的代码import signal, turtledef 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 hereturtle.mainloop()编辑:我需要一段代码,或者至少需要一个循环来保持部分重复。在伪代码中它看起来像这样:Several turtles each write one letter somewhere on the screenProgram waits for user to input a letterAward/deduct points based on if they got it right or wronggo 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()
查看完整描述

1 回答

?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

除了while True:@martineau 提供的“永远不要在基于事件的环境中使用”建议之外,您无需将“信号”库拖到代码中,因为您可以使用ontimer()事件处理它。


我需要一段代码,或者至少需要一个循环来保持一个部分的重复。


为了解决这个问题,我用一个简单的游戏替换了我之前的示例代码,该游戏显示一个字母,并会不断在屏幕上移动它并每两秒改变它的颜色,直到您输入该字母。之后,它将更改为不同的字母并继续:


from turtle import Screen, Turtle

from random import shuffle, randrange

from itertools import cycle


WIDTH, HEIGHT = 600, 600


FONT_SIZE = 36

FONT = ('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 = LETTERS

shuffle(letters)

letters = cycle(letters)

letter = next(letters)


colors = COLORS

shuffle(colors)

colors = cycle(colors)


hit = None


screen = 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()事件分配和处理程序,而无需为字母表中的每个字母重写相同的代码......


查看完整回答
反对 回复 2021-11-16
  • 1 回答
  • 0 关注
  • 209 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信