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

时间:2019-02-22 00:47:42

标签: python while-loop user-input turtle-graphics

我正在尝试制作一个游戏,其中的乌龟需要能够注册并响应用户输入(简化后,会出现一个字母,用户需要在键盘上单击它。因此,如果显示“ b”,用户类型“ 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()

1 个答案:

答案 0 :(得分:1)

@martineau提供了“在基于事件的环境中永不使用while True:”的建议,您无需将“信号”库拖到代码中,因为您可以使用{ {1}}事件。

  

我需要在其中放置一会儿代码,或者至少需要一个循环才能保留一个部分   重复。

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

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:事件分配和处理程序,而不必为字母表中的每个字母重写相同的代码...