如果 while 循环处于活动状态,Turtle-graphics 不响应 onkey() 命令
Turtle-graphics not responding to onkey() commands if a while loop is active
我正在尝试制作一个游戏,其中乌龟需要能够注册并响应用户输入(简化后,会出现一个字母,用户需要在键盘上单击它。所以如果它显示 "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()
编辑:我需要一个 while 代码或至少一个循环来保持部分重复。在伪代码中它看起来像这样:
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 上,则命令提示符)因为我将对字母进行颜色编码以显示要避免哪些字母以及要输入哪些字母。我应该怎么写这个?
我还想快速提一下,我以前遇到过 "avoided" 这个问题。在下面的代码中,程序在 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()
连同@martineau 提供的 "never use while True:
in an event-based environment" 建议,您不需要将 'signal' 库拖到代码中,因为您可以使用 ontimer()
事件来处理它。
I need a while code in there or at least a loop to keep a section
repeating.
为了解决这个问题,我用一个简单的游戏替换了我之前的示例代码,该游戏显示一个字母并会在屏幕上不断移动它并每两秒更改一次颜色,直到您键入该字母。之后,它将更改为不同的字母并继续:
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()
确保在键入之前单击 window 以使其侦听输入。
希望这会给您一些想法,如何在不使用 while True:
循环的情况下解决更复杂的问题。或者至少向您展示如何设置所有 onkey()
事件分配和处理程序,而无需为字母表中的每个字母重写相同的代码...
我正在尝试制作一个游戏,其中乌龟需要能够注册并响应用户输入(简化后,会出现一个字母,用户需要在键盘上单击它。所以如果它显示 "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()
编辑:我需要一个 while 代码或至少一个循环来保持部分重复。在伪代码中它看起来像这样:
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 上,则命令提示符)因为我将对字母进行颜色编码以显示要避免哪些字母以及要输入哪些字母。我应该怎么写这个?
我还想快速提一下,我以前遇到过 "avoided" 这个问题。在下面的代码中,程序在 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()
连同@martineau 提供的 "never use while True:
in an event-based environment" 建议,您不需要将 'signal' 库拖到代码中,因为您可以使用 ontimer()
事件来处理它。
I need a while code in there or at least a loop to keep a section repeating.
为了解决这个问题,我用一个简单的游戏替换了我之前的示例代码,该游戏显示一个字母并会在屏幕上不断移动它并每两秒更改一次颜色,直到您键入该字母。之后,它将更改为不同的字母并继续:
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()
确保在键入之前单击 window 以使其侦听输入。
希望这会给您一些想法,如何在不使用 while True:
循环的情况下解决更复杂的问题。或者至少向您展示如何设置所有 onkey()
事件分配和处理程序,而无需为字母表中的每个字母重写相同的代码...