我正在尝试输入框。 这样我们就可以在其中输入内容了。
我遇到的第一个问题是,当我们尝试按住某个键一段时间时,它只会重复一次。 现在,在此链接上完成的答案的帮助下,此问题得以解决:Pygame key hold down?
但是,现在遇到的问题是,当我们尝试只按一次键时,有时会重复多次(两次或更多次)。
伪代码如下:
for event in pygame.event.get():
if event.type == QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE):
self.quit_screen = True
# events related to the input box
if event.type == pygame.MOUSEBUTTONDOWN:
#Things related to it
#Disactivate the typing on the input box if KEYUP activated
if event.type == pygame.KEYUP:
self.typing = False
self.backspace_pressed = False
if event.type == pygame.KEYDOWN:
print("KEYDOWN\n")
if self.user_input_box.input_box_active:
# If we press 'enter', we save
if event.key == pygame.K_RETURN:
#save the text in some variables
# If we press the key '\b' (backspace), we delete a caracter
elif event.key == pygame.K_BACKSPACE:
self.backspace_pressed = True
else: #Get the current letter
self.typing = True
self.cur_letter = event.unicode
if self.typing: #Adding the letter saved in cur_letter to the current text(user_entry)
self.user_input.user_entry += self.cur_letter
if self.backspace_pressed:
self.user_input.user_entry = self.user_input.user_entry[:-1]
答案 0 :(得分:0)
您可以延迟一下以区分按一次还是按住。您可以定义一些这样的变量:
self.press_timer = 0
self.already_pressed = False
,然后,在键控代码中,您可以继续添加此数字,直到达到特定阈值为止。所以...
if event.type == pygame.KEYDOWN:
self.press_timer += 1
if press_timer < 50 and not self.already_pressed:
# Typing code
self.already_pressed = True
elif press_timer > 50 and self.already_pressed:
# Same code, but without setting already_pressed to True
然后,在pygame.KEYUP代码中...
if event.type == pygame.KEYUP:
self.typing = False
self.backspace_pressed = False
self.press_timer = 0
self.already_pressed = False
这应该允许回旋余地按下一个键,然后将其保持一定的时间,然后不断添加字母。
答案 1 :(得分:0)
如果您想重复输入密钥,那么您所做的并不是正确的方法。最好让系统在感觉到某个键被按下时向您发送多个事件。通过在启动事件检查循环之前进行设置,可以使系统向您发送重复的KEYDOWN事件,以供您按下该键:
pygame.key.set_repeat(delay, interval)
您可以看到更多here in the docs
默认情况下它是关闭的,因此您必须启用它。
关于您当前的代码以及为什么您重复执行或不希望重复的代码,您正在运行以下行:
if self.typing: #Adding the letter saved in cur_letter to the current text(user_entry)
self.user_input.user_entry += self.cur_letter
每次都会经过事件循环,这意味着任何事件都将导致您执行它。可能会发生一些您可能没有想到的事件。某些事件可能会发生,例如鼠标移动事件,但也可能发生其他一些幕后事件。您可以通过在循环顶部添加以下行进行调试来查看这些事件是什么:
print(f"event: {pygame.event.event_name(event.type)}")