【问题标题】:Pygame reading multiple keydown events when key was not pressed?Pygame在未按下键时读取多个keydown事件?
【发布时间】:2019-11-15 00:27:38
【问题描述】:

我一直在尝试为 pygame 开发一个“文本框”类作为一个小型个人项目,但我遇到了一个让我非常困惑的问题。我正在尝试扩展找到here 的pygame 文本输入类,将其包装在支持多行的文本框类中,并希望支持滚动功能。

我的问题是在文本行之间上下移动闪光灯时出现的。基本上,一旦按下“向上”箭头,闪光灯就会一直移动到顶部,然后它就会停止响应向下移动。

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

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()

这是文本框类的代码(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 本身的错误吗?

感谢您提供的任何帮助。我对此很陌生,我希望我正确地格式化了这个问题。

【问题讨论】:

  • 文本框类是如何循环事件的?会不会多次处理同一个事件?

标签: python pygame keydown


【解决方案1】:

只需看看您在问题中链接的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 的事件队列来重复关键事件。

【讨论】:

  • 谢谢,就是这样!当我接住它时应该看到我的头撞到桌子上。
猜你喜欢
  • 1970-01-01
  • 2016-06-06
  • 1970-01-01
  • 2014-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多