For Python, I warmly recommend starting early with PySDL2 and/or Qt5 (PyQt5 or PySide2), and using Inkscape to create all graphics in the SVG (Scalable Vector Graphics) format, saving originals in Inkscape SVG format, and "finals" using Optimized SVG. The former retains your Inkscape guides and such, but the latter optimizes the SVG for parsers, also shrinking the file size. SVG images are fully scalable, support transparency, and even gradient fills. You can also use any browser to view SVG files.
The reason for this is that you can do real games and applications this way, and have them look as professional as you can. There are no limitations. Even if you decide you go to high-performance graphics via OpenGL, that works too; there are display widgets for that as well.
The one annoying thing with Inkscape is that when you do computer graphics with it, you need to do a three-step Document Setup in the beginning.
First, in
File >
Document Properties, you need to set
Display Units: px and
Units: px,
Scale: 1,
Checkerboard Background, and
Width: and
Height: to the desired size in pixels. This way, all
px measurement units in the SVG file are in native SVG units, and you get the best results overall (no DPI issues et cetera; these work just fine even on HiDPI displays). See attached
inkscape-1-pixel-mode.png.
Because Inkscape chose the right-hand coordinate system with origin at bottom left corner, changing document properties will always introduce an annoying translation to the SVG coordinates, even when the canvas is empty. To fix that, in
Edit >
XML Editor, select the
id="layer1" element on the left, and then the
transform on the right. Delete it using the
Delete Attribute button top right, and close that window. See attached
inkscape-2-fix-transform.png.
Modifying any of the layers in
XML Editor causes Inkscape to drop to canvas
root "layer". You don't want to draw there, you want to switch to
Layer 1, because Inkscape uses the SVG
g layers to do its internal markup and such. The selection is at the bottom left/center of the window; just click where it reads
(root) and pick
Layer 1. See attached
inkscape-3-select-layer.png.
In Python, you can load SVG files as
QPixmap objects, which are optimized for display on-screen. You can use a QPixmap in
QLabels instead of text, in
QGraphicsScenes, even in
QPictures if you want to create a drawing application of some sort.
Of course, there are Python modules and libraries that make it even easier to create games, but this is the "real world" complexity level when creating user interfaces and applications in Python. As
PySDL2 documentation shows, it is much more oriented towards game development, and has its own internal approach and model as to how game mechanics (sprites, et cetera) should be constructed.
However, both firmly use event-based programming model, the main difference being that with SDL2 the programmer is in control of the event loop, whereas in Qt5 (and basically in all windowing toolkits like Gtk, FLTK, etc.) the toolkit is in charge, and you just write the code responding to the events.
To additionally interface to microcontrollers, I recommend using a separate Python thread (or two); or a separate process, if there is a significant amount of data (more than full-speed USB, 12 Mbit/s) or processing (like FFTs or such) involved.