When it comes to building in-game UIs in Python, pygame-gui and imgui_bundle take two very different approaches. I’ve tried both, and while each has its strengths, they suit different needs and workflows.
pygame-gui is much easier to drop into a Pygame project. It runs in the same Pygame window, supports importing images for things like icons or backgrounds, and has a fairly intuitive system for changing appearance using JSON themes, kind of like CSS for your UI. It feels designed with game development in mind, and getting a decent-looking interface up and running is straightforward.

On the other hand, imgui_bundle (a Python binding around Dear ImGui) is lightning-fast and super responsive, but requires more setup. It doesn’t integrate directly with Pygame’s event/render loop, so you need to handle your own windowing and rendering context—usually with something like GLFW or SDL2. There were a few examples it being used with ModernGL, but I wasn’t convinced. It’s powerful for tool development or standalone editors, but for an embedded UI inside a Pygame game, it ends up being more work.

In the end, I picked pygame-gui for its ease of use and better out-of-the-box support for the kind of UI I needed even though it comes at the expense of FPS compared to imgui_bundle…