Pygame-按住的键:按下某个键时,一些角色被多次写入

时间:2019-03-29 15:37:25

标签: python-3.x pygame

我正在尝试输入框。 这样我们就可以在其中输入内容了。

我遇到的第一个问题是,当我们尝试按住某个键一段时间时,它只会重复一次。 现在,在此链接上完成的答案的帮助下,此问题得以解决: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]

2 个答案:

答案 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)}")