Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

KEYDOWN events do only return "unicode" property for some keys (3229) #1609

Open
GalacticEmperor1 opened this issue Feb 12, 2023 · 0 comments · May be fixed by #3357
Open

KEYDOWN events do only return "unicode" property for some keys (3229) #1609

GalacticEmperor1 opened this issue Feb 12, 2023 · 0 comments · May be fixed by #3357
Labels
bug Not working as intended event pygame.event

Comments

@GalacticEmperor1
Copy link
Collaborator

Issue №3229 opened by fladd at 2022-06-10 17:08:44

When getting key down events from the event cue, only a few keys have the "unicode" property filled with the correct key (most are empty).

Which keys have it and which don't, depends on which keys you press first:

<Event(768-KeyDown {'unicode': '1', 'key': 49, 'mod': 4096, 'scancode': 30, 'window': None})>
<Event(768-KeyDown {'unicode': '2', 'key': 50, 'mod': 4096, 'scancode': 31, 'window': None})>
<Event(768-KeyDown {'unicode': '3', 'key': 51, 'mod': 4096, 'scancode': 32, 'window': None})>
<Event(768-KeyDown {'unicode': '4', 'key': 52, 'mod': 4096, 'scancode': 33, 'window': None})>
<Event(768-KeyDown {'unicode': '5', 'key': 53, 'mod': 4096, 'scancode': 34, 'window': None})>
<Event(768-KeyDown {'unicode': '6', 'key': 54, 'mod': 4096, 'scancode': 35, 'window': None})>
<Event(768-KeyDown {'unicode': '7', 'key': 55, 'mod': 4096, 'scancode': 36, 'window': None})>
<Event(768-KeyDown {'unicode': '8', 'key': 56, 'mod': 4096, 'scancode': 37, 'window': None})>
<Event(768-KeyDown {'unicode': '9', 'key': 57, 'mod': 4096, 'scancode': 38, 'window': None})>
<Event(768-KeyDown {'unicode': '0', 'key': 48, 'mod': 4096, 'scancode': 39, 'window': None})>
<Event(768-KeyDown {'unicode': 'a', 'key': 97, 'mod': 4096, 'scancode': 4, 'window': None})>
<Event(768-KeyDown {'unicode': 'b', 'key': 98, 'mod': 4096, 'scancode': 5, 'window': None})>
<Event(768-KeyDown {'unicode': 'c', 'key': 99, 'mod': 4096, 'scancode': 6, 'window': None})>
<Event(768-KeyDown {'unicode': 'd', 'key': 100, 'mod': 4096, 'scancode': 7, 'window': None})>
<Event(768-KeyDown {'unicode': 'e', 'key': 101, 'mod': 4096, 'scancode': 8, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 102, 'mod': 4096, 'scancode': 9, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 103, 'mod': 4096, 'scancode': 10, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 104, 'mod': 4096, 'scancode': 11, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 105, 'mod': 4096, 'scancode': 12, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 106, 'mod': 4096, 'scancode': 13, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 107, 'mod': 4096, 'scancode': 14, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 108, 'mod': 4096, 'scancode': 15, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 109, 'mod': 4096, 'scancode': 16, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 110, 'mod': 4096, 'scancode': 17, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 111, 'mod': 4096, 'scancode': 18, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 112, 'mod': 4096, 'scancode': 19, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 113, 'mod': 4096, 'scancode': 20, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 114, 'mod': 4096, 'scancode': 21, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 115, 'mod': 4096, 'scancode': 22, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 116, 'mod': 4096, 'scancode': 23, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 117, 'mod': 4096, 'scancode': 24, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 118, 'mod': 4096, 'scancode': 25, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 119, 'mod': 4096, 'scancode': 26, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 120, 'mod': 4096, 'scancode': 27, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 121, 'mod': 4096, 'scancode': 28, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 122, 'mod': 4096, 'scancode': 29, 'window': None})>

And if you go from behind, this happens:

<Event(768-KeyDown {'unicode': 'z', 'key': 122, 'mod': 4096, 'scancode': 29, 'window': None})
<Event(768-KeyDown {'unicode': 'y', 'key': 121, 'mod': 4096, 'scancode': 28, 'window': None})
<Event(768-KeyDown {'unicode': 'x', 'key': 120, 'mod': 4096, 'scancode': 27, 'window': None})
<Event(768-KeyDown {'unicode': 'w', 'key': 119, 'mod': 4096, 'scancode': 26, 'window': None})
<Event(768-KeyDown {'unicode': 'v', 'key': 118, 'mod': 4096, 'scancode': 25, 'window': None})
<Event(768-KeyDown {'unicode': 'u', 'key': 117, 'mod': 4096, 'scancode': 24, 'window': None})
<Event(768-KeyDown {'unicode': 't', 'key': 116, 'mod': 4096, 'scancode': 23, 'window': None})
<Event(768-KeyDown {'unicode': 's', 'key': 115, 'mod': 4096, 'scancode': 22, 'window': None})
<Event(768-KeyDown {'unicode': 'r', 'key': 114, 'mod': 4096, 'scancode': 21, 'window': None})
<Event(768-KeyDown {'unicode': 'q', 'key': 113, 'mod': 4096, 'scancode': 20, 'window': None})
<Event(768-KeyDown {'unicode': 'p', 'key': 112, 'mod': 4096, 'scancode': 19, 'window': None})
<Event(768-KeyDown {'unicode': 'o', 'key': 111, 'mod': 4096, 'scancode': 18, 'window': None})
<Event(768-KeyDown {'unicode': 'n', 'key': 110, 'mod': 4096, 'scancode': 17, 'window': None})
<Event(768-KeyDown {'unicode': 'm', 'key': 109, 'mod': 4096, 'scancode': 16, 'window': None})
<Event(768-KeyDown {'unicode': 'l', 'key': 108, 'mod': 4096, 'scancode': 15, 'window': None})
<Event(768-KeyDown {'unicode': '', 'key': 107, 'mod': 4096, 'scancode': 14, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 106, 'mod': 4096, 'scancode': 13, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 105, 'mod': 4096, 'scancode': 12, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 104, 'mod': 4096, 'scancode': 11, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 103, 'mod': 4096, 'scancode': 10, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 102, 'mod': 4096, 'scancode': 9, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 101, 'mod': 4096, 'scancode': 8, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 100, 'mod': 4096, 'scancode': 7, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 99, 'mod': 4096, 'scancode': 6, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 98, 'mod': 4096, 'scancode': 5, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 97, 'mod': 4096, 'scancode': 4, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 48, 'mod': 4096, 'scancode': 39, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 57, 'mod': 4096, 'scancode': 38, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 56, 'mod': 4096, 'scancode': 37, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 55, 'mod': 4096, 'scancode': 36, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 54, 'mod': 4096, 'scancode': 35, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 53, 'mod': 4096, 'scancode': 34, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 52, 'mod': 4096, 'scancode': 33, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 51, 'mod': 4096, 'scancode': 32, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 50, 'mod': 4096, 'scancode': 31, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 49, 'mod': 4096, 'scancode': 30, 'window': None})>

And if you do one key repeatedly:

<Event(768-KeyDown {'unicode': 'a', 'key': 97, 'mod': 4096, 'scancode': 4, 'window': None})>
<Event(768-KeyDown {'unicode': 'a', 'key': 97, 'mod': 4096, 'scancode': 4, 'window': None})>
<Event(768-KeyDown {'unicode': 'a', 'key': 97, 'mod': 4096, 'scancode': 4, 'window': None})>
<Event(768-KeyDown {'unicode': 'a', 'key': 97, 'mod': 4096, 'scancode': 4, 'window': None})>
<Event(768-KeyDown {'unicode': 'a', 'key': 97, 'mod': 4096, 'scancode': 4, 'window': None})>
<Event(768-KeyDown {'unicode': 'a', 'key': 97, 'mod': 4096, 'scancode': 4, 'window': None})>
<Event(768-KeyDown {'unicode': 'a', 'key': 97, 'mod': 4096, 'scancode': 4, 'window': None})>
<Event(768-KeyDown {'unicode': 'a', 'key': 97, 'mod': 4096, 'scancode': 4, 'window': None})>
<Event(768-KeyDown {'unicode': 'a', 'key': 97, 'mod': 4096, 'scancode': 4, 'window': None})>
<Event(768-KeyDown {'unicode': 'a', 'key': 97, 'mod': 4096, 'scancode': 4, 'window': None})>
<Event(768-KeyDown {'unicode': 'a', 'key': 97, 'mod': 4096, 'scancode': 4, 'window': None})>
<Event(768-KeyDown {'unicode': 'a', 'key': 97, 'mod': 4096, 'scancode': 4, 'window': None})>
<Event(768-KeyDown {'unicode': 'a', 'key': 97, 'mod': 4096, 'scancode': 4, 'window': None})>
<Event(768-KeyDown {'unicode': 'a', 'key': 97, 'mod': 4096, 'scancode': 4, 'window': None})>
<Event(768-KeyDown {'unicode': 'a', 'key': 97, 'mod': 4096, 'scancode': 4, 'window': None})>
<Event(768-KeyDown {'unicode': 'a', 'key': 97, 'mod': 4096, 'scancode': 4, 'window': None})>
<Event(768-KeyDown {'unicode': 'a', 'key': 97, 'mod': 4096, 'scancode': 4, 'window': None})>
<Event(768-KeyDown {'unicode': 'a', 'key': 97, 'mod': 4096, 'scancode': 4, 'window': None})>
<Event(768-KeyDown {'unicode': 'a', 'key': 97, 'mod': 4096, 'scancode': 4, 'window': None})>
<Event(768-KeyDown {'unicode': 'a', 'key': 97, 'mod': 4096, 'scancode': 4, 'window': None})>
<Event(768-KeyDown {'unicode': 'a', 'key': 97, 'mod': 4096, 'scancode': 4, 'window': None})>
<Event(768-KeyDown {'unicode': 'a', 'key': 97, 'mod': 4096, 'scancode': 4, 'window': None})>
<Event(768-KeyDown {'unicode': 'a', 'key': 97, 'mod': 4096, 'scancode': 4, 'window': None})>
<Event(768-KeyDown {'unicode': 'a', 'key': 97, 'mod': 4096, 'scancode': 4, 'window': None})>
<Event(768-KeyDown {'unicode': 'a', 'key': 97, 'mod': 4096, 'scancode': 4, 'window': None})>
<Event(768-KeyDown {'unicode': 'a', 'key': 97, 'mod': 4096, 'scancode': 4, 'window': None})>
<Event(768-KeyDown {'unicode': 'a', 'key': 97, 'mod': 4096, 'scancode': 4, 'window': None})>
<Event(768-KeyDown {'unicode': 'a', 'key': 97, 'mod': 4096, 'scancode': 4, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 98, 'mod': 4096, 'scancode': 5, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 98, 'mod': 4096, 'scancode': 5, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 98, 'mod': 4096, 'scancode': 5, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 98, 'mod': 4096, 'scancode': 5, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 98, 'mod': 4096, 'scancode': 5, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 98, 'mod': 4096, 'scancode': 5, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 98, 'mod': 4096, 'scancode': 5, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 98, 'mod': 4096, 'scancode': 5, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 98, 'mod': 4096, 'scancode': 5, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 98, 'mod': 4096, 'scancode': 5, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 98, 'mod': 4096, 'scancode': 5, 'window': None})>

System:
Windows 10
Python 3.9.5
Pygame 2.1.2


Comments

# # ankith26 commented at 2022-06-10 17:21:23

Hello, thanks for the bug report!

I can't reproduce this bug with a basic event example, could you please post a minimal reproducer that demonstrates your problem?

Also, are you pressing the keys simultaneously?


# # fladd commented at 2022-06-10 22:07:38

Here is a minimal example:

import pygame


pygame.init()
pygame.display.set_mode((100, 100))

while True:
    events = pygame.event.get(pygame.KEYDOWN)
    for event in events:
        print(event)

Run this, start pressing keys (one after the other, not simultaneously), and then watch the terminal output.


# # fladd commented at 2022-06-10 22:11:48

Also happens on MacOS with Python 3.10.4 and Pygame 2.1.2.


# # ankith26 commented at 2022-06-11 03:11:31

Thanks for the reproducer, that shows the real issue here.

The issue only happens when you do pygame.event.get(pygame.KEYDOWN) (AKA you are only handling KEYDOWN events and ignoring the rest)

When you are only handling particular events, the event queue can fill up with the events you don't handle and this increases memory usage (also there is a limit to how much the queue can grow so at one point it might overflow as the docs point out too).
So in general, you need to call pygame.event.get() atleast once per loop, but you can call pygame.event.get(pygame.KEYDOWN) before doing so, and doing this should fix your issue as well.

Internally, pygame generates the unicode property for every KEYDOWN and stores it till the corresponding KEYUP is given to the user. In order to not leak to much memory, there is a limit in pygame how many keydown unicode fields are stored (at the moment it is 15). To fix this issue, this limit will have to be lifted (along with a few more changes)


# # fladd commented at 2022-06-11 22:08:24

Thanks for the response and explanation. It seems that getting all events is not necessary, but that just also getting the KEYUP events (even though they are of no interest) will already solve the issue:

import pygame


pygame.init()
pygame.display.set_mode((100, 100))

while True:
    pygame.event.pump()
    events = pygame.event.get(pygame.KEYDOWN)
    pygame.event.get(pygame.KEYUP)   #  workaround for https://github.com/pygame/pygame/issues/3229
    for event in events:
        print(event)
@GalacticEmperor1 GalacticEmperor1 added bug Not working as intended event pygame.event reproducible labels Feb 12, 2023
oddbookworm added a commit to oddbookworm/pygame-ce that referenced this issue Mar 1, 2025
@ankith26 ankith26 linked a pull request Mar 1, 2025 that will close this issue
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Not working as intended event pygame.event
Projects
None yet
2 participants