From a13ba2ee3b4b8719379bc86d3008512499381a97 Mon Sep 17 00:00:00 2001 From: Luke Granger-Brown Date: Tue, 1 Feb 2022 19:49:45 +0000 Subject: [PATCH] Support Python distributions where _tkinter is compiled in In some cases, the Tk library may have been directly compiled in or bundled into the main executable by the time Pillow runs, in which case __file__ isn't available (nor would it make sense to use, anyway). If __file__ is missing, then set the library path to None and rely on our Tk loader being able to find the function pointers within the main binary - we know we probably have it because we've managed to import it already. --- src/PIL/_tkinter_finder.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/PIL/_tkinter_finder.py b/src/PIL/_tkinter_finder.py index ba4d045e681..5253f075956 100644 --- a/src/PIL/_tkinter_finder.py +++ b/src/PIL/_tkinter_finder.py @@ -5,10 +5,15 @@ import warnings from tkinter import _tkinter as tk -if hasattr(sys, "pypy_find_executable"): - TKINTER_LIB = tk.tklib_cffi.__file__ -else: - TKINTER_LIB = tk.__file__ +try: + if hasattr(sys, "pypy_find_executable"): + TKINTER_LIB = tk.tklib_cffi.__file__ + else: + TKINTER_LIB = tk.__file__ +except AttributeError: + # _tkinter may be compiled directly into Python, in which case __file__ is + # not available. load_tkinter_funcs will check the binary first in any case. + TKINTER_LIB = None tk_version = str(tkinter.TkVersion) if tk_version == "8.4":