Pygame 未按下按键时读取多个按键事件?

Pygame reading multiple keydown events when key was not pressed?

我一直在尝试为 pygame 开发一个 "text box" class 作为一个小的个人项目,但我遇到了一个真正困扰我的问题。我正在尝试扩展 class 找到的 pygame 文本输入 here,将其包装在支持多行并希望支持滚动功能的文本框 class 中。

我的问题出现在尝试在文本行之间上下移动方向指示灯时。基本上,一旦按下 "up" 箭头,信号灯就会一直移动到顶部,然后它就会停止响应将其向下移动。

这是我如何为 pygame_textbox class 提供事件的代码:

while True:

    events = pygame.event.get()

    for event in events:


        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    test_box.update(events)
    test_box_2.update(events)

    test_box.draw(screen, (100, 100))
    test_box_2.draw(screen, (200, 250))

    pygame.display.update()

这里是文本框的代码class(event来自上面的代码):

         if event.type == pl.KEYDOWN:
                if self.is_active:
                    print("reading in text box: {}".format(event))
                    if event.key == pl.K_UP and self.cursor_line > 0:
                        self.cursor_line -= 1
                        print("cursor going UP to {}".format(self.cursor_line))
                    if event.key == pl.K_DOWN and self.cursor_line < len(self.text_input)-1:
                        self.cursor_line += 1
                        print("cursor going DOWN to {}".format(self.cursor_line))
                    if event.key == pl.K_RETURN:
                        self.text_input.insert(self.cursor_line+1, pygame_textinput.TextInput())
                        self.cursor_line += 1
                        for line in self.text_input:
                            print(line.input_string)

尝试调试它似乎表明 pygame.event.get() 队列正在接收比预期更多的 KEYDOWN 事件;一次按下按钮会发送多个(有时是持续的)事件。我是 pygame 的新手,但我很确定 KEYDOWN 事件不应该发生这种情况,对吧?每次按下一个键时只应该触发一个事件。我在这里做错了什么?这是 pygame 本身的错误吗?

感谢您提供的任何帮助。我在这方面还很陌生,我希望我的问题格式正确。

看看您在问题中链接的 pygame_textinput 模块:

    # Update key counters:
    for key in self.keyrepeat_counters:
        self.keyrepeat_counters[key][0] += self.clock.get_time()  # Update clock

        # Generate new key events if enough time has passed:
        if self.keyrepeat_counters[key][0] >= self.keyrepeat_intial_interval_ms:
            self.keyrepeat_counters[key][0] = (
                self.keyrepeat_intial_interval_ms
                - self.keyrepeat_interval_ms
            )

            event_key, event_unicode = key, self.keyrepeat_counters[key][1]
            pygame.event.post(pygame.event.Event(pl.KEYDOWN, key=event_key, unicode=event_unicode))

如您所见,TextInputupdate 方法通过将关键事件再次发布到 pygame 的事件队列来重复这些事件。