当前位置: 首页 > 知识库问答 >
问题:

PyGame读取多个keydown事件时,键是不按?

越心水
2023-03-14

我一直试图为pyplay开发一个“文本框”类,作为一个小小的个人项目,我遇到了一个真正难倒我的问题。我试图扩展在这里找到的pyplay文本输入类,把它包装在一个支持多行和滚动功能的文本框类中。

当我试图在文本行之间上下移动闪光灯时,问题就来了。基本上,一旦按下“向上”箭头,就会将闪光灯一直移动到顶部,然后它就不再响应向下移动。

下面是我如何给pygame\u文本框类事件的代码:

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事件;按下按钮发送多个(有时是正在进行的)事件。我是pyplay的新手,但我很确定这不应该发生在KEYDOWN事件中,对吗?每次按下一个键只应该触发一个事件。我到底做错了什么?这是pyplay本身的错误吗?

谢谢你能提供的帮助。我对这方面还不太熟悉,我希望我的问题是正确的。

共有1个答案

欧阳鸿哲
2023-03-14

看看你在问题中链接的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的事件队列来重复这些事件。

 类似资料:
  • 我遇到了一个奇怪的JavaScript问题。我正在开发一个使用键盘输入的HTML5画布游戏。游戏的双人模式需要按住键盘上最多6个键。 在我按住键盘上的4或5个键后,似乎停止调用“keyDown”事件。 我使用的代码如下: 控制台应该为我按下的每个键记录一个键代码。然而,它似乎只报告我按住的前4或5个键的密码。这导致了当两个玩家按下太多键时,我的游戏的双玩家版本的控件无法工作。 这是一个bug,是J

  • 嗨,在用pygame开发游戏时,有一个问题其实并不重要,但它一直困扰着我一段时间。 所以上面是一个工作代码,我相信 同样有效。 然而,当我只是尝试类似“event.key==pyplay。K_RIGHT:",python给我一个错误,说没有属性'key'。虽然我知道选择以上2个代码会更合理,而不仅仅是“event.key==pyplay。K_RIGHT:",我不知道为什么pyplay会说事件没有属

  • 谁能解释一下为什么numpad keyup和keydown事件返回不同的键值? 考虑一下这个: 我本来以为每个事件都会为键降和键增返回相同的键值,但相反,我得到了下面的输出(在按0,1,2,8和9之后): 按键:代码:96,按键:0<br>按键:代码:96,按键` keydown:代码:97,密钥:1 keyup:代码:97,密钥:a 向下键:代码:98,键:2 向上键:代码:98,键:b 按键:

  • 我发现了很多相关的问题(这里和其他地方),但没有具体找到这个问题。 我正在尝试侦听箭头键(37-40)的键关闭事件,但是当以特定顺序使用箭头键时,后续箭头不会生成“keydown”事件。 示例:http://blog.pothoven.net/2008/05/keydown-vs-keypress-in-javascript.html 在该页面上,单击“在此处键入 - 但是,如果我做同样的事情,但

  • 我使用JQuery来处理我游戏中的所有按键,我的事件处理得很好,但我想限制玩家,因为如果他们按下一个键并按住它,它不会继续发射。 这是我当前的代码: 有人知道如何实现这样的东西吗?我找不到这样的东西。。。

  • 问题内容: 我一直在尝试使用python编写小型2D游戏的代码。 所有这些都在循环内运行。基本上,每按一次箭头键,方向指示器dir_就会更改,它将在检查点编号上加1并将当前对象的当前头部位置(在索引位置插入该头部对象。)但是,不幸的是,所有这些点都是最新的。该列表是实现我的逻辑的重要因素。 在start时,这是when是2,when循环正在开始另一个迭代(取自创建的日志文件)。所有要附加的点都在上