FYI - python-build-standalone now builds dynamic Tkinter/Tcl/Tk
Hi! In today's release of python-build-standalone we've split out _tkinter, libtcl, and libtk into their own dynamic libraries (astral-sh/python-build-standalone#676). I haven't tested with PyInstaller myself yet but I imagine this is helpful. It looks like the implementation of #9014 is that it will magically work now, but I figured I'd open an issue so you all can explicitly test. Please let me know if something in this setup doesn't work right for you!
You can test it out by making sure you have the latest version of uv and you've upgraded your managed Python installs, or grabbing the 20250808 release from python-build-standalone. See https://github.com/astral-sh/python-build-standalone/issues/129#issuecomment-3169282440 for full instructions.
Details on the implementation, if it's helpful:
_tkinteris now a separate extension module and no longer statically linked into bin/python and libpython (so any user code using_tkinterwill need to bundle the dynamic library and unpack it at runtime)- There are separate
libtcl8.6.soandlibtk8.6.so(or.dylib) libraries inside ourlibdirectory. - On Linux,
bin/python3has aDT_RPATHpointing it at thelibdirectory, soimport _tkinterfinds our copies of libtcl and libtk. Users oflibpython3.x.sowill need to set up rpaths or something on their own. (If it's helpful can add an rpath tolibpython3.x.so, or tweak theDT_NEEDEDin_tkinterto use$ORIGIN/../../libtcl8.6.soetc. (though that trick would only work for gllibc, not musl). - On macOS,
lib/python3.x/lib-dynload/_tkinter.cpython-3x-darwin.sohas anLC_RPATHpointing at@loader_path/../../, and the install name of libtcl and theLC_LOAD_DYLIBentry in_tkinteris@rpath/libtcl8.6.so.dylib, and the same for libtk. So if you maintain thelib/directory structure you shouldn't need to fiddle with library paths on your own. - libX11 and friends are now statically linked into
libtk. At some point I might make these dynamic libraries and/or attempt to look for the system version.
Source: pyinstaller/pyinstaller