Repository: matplotlib/matplotlib
File: lib/matplotlib/backends/_backend_tk.py (Python)

Code before:
import matplotlib as mpl
from matplotlib import _api, backend_tools, cbook, _c_internal_utils
from matplotlib.backend_bases import (
    _Backend, FigureCanvasBase, FigureManagerBase, NavigationToolbar2,
    TimerBase, ToolContainerBase, cursors, _Mode, MouseButton,
    CloseEvent, KeyEvent, LocationEvent, MouseEvent, ResizeEvent)
from matplotlib._pylab_helpers import Gcf

try:
    from . import _tkagg
    from ._tkagg import TK_PHOTO_COMPOSITE_OVERLAY, TK_PHOTO_COMPOSITE_SET
except ImportError as e:
    # catch incompatibility of python-build-standalone with Tk
    cause1 = getattr(e, '__cause__', None)
    cause2 = getattr(cause1, '__cause__', None)
    if (isinstance(cause1, ImportError) and
        isinstance(cause2, AttributeError) and
        "'_tkinter' has no attribute '__file__'" in str(cause2)):

        is_uv_python = "/uv/python" in (os.path.realpath(sys.executable))
        if is_uv_python:
            raise ImportError(
                "Failed to import tkagg backend. You are using a uv-installed python "
                "executable, which is not compatible with Tk. "
                "Please update your python via: "
                "`uv self update && uv python upgrade --reinstall`"
                ) from e
        else:
            raise ImportError(
                "Failed to import tkagg backend. This is likely caused by using a "
                "Python executable based on python-build-standalone, which is not "
                "compatible with Tk. "
                "Please use another Python interpreter or select another backend."
                ) from e
    else:
        raise


_log = logging.getLogger(__name__)
cursord = {
    cursors.MOVE: "fleur",
    cursors.HAND: "hand2",
    cursors.POINTER: "arrow",
    cursors.SELECT_REGION: "crosshair",
    cursors.WAIT: "watch",
    cursors.RESIZE_HORIZONTAL: "sb_h_double_arrow",
    cursors.RESIZE_VERTICAL: "sb_v_double_arrow",
}


@contextmanager

Review comment (suggestion):
I think this is fine, but just so you're aware, `uv self update` won't be available for users that have installed uv through their package manager instead of the standalone installer. A more "general" solution would be to "upgrade to the latest version of uv then use `uv python upgrade --reinstall`"

Code after:
import matplotlib as mpl
from matplotlib import _api, backend_tools, cbook, _c_internal_utils
from matplotlib.backend_bases import (
    _Backend, FigureCanvasBase, FigureManagerBase, NavigationToolbar2,
    TimerBase, ToolContainerBase, cursors, _Mode, MouseButton,
    CloseEvent, KeyEvent, LocationEvent, MouseEvent, ResizeEvent)
from matplotlib._pylab_helpers import Gcf

try:
    from . import _tkagg
    from ._tkagg import TK_PHOTO_COMPOSITE_OVERLAY, TK_PHOTO_COMPOSITE_SET
except ImportError as e:
    # catch incompatibility of python-build-standalone with Tk
    cause1 = getattr(e, '__cause__', None)
    cause2 = getattr(cause1, '__cause__', None)
    if (isinstance(cause1, ImportError) and
        isinstance(cause2, AttributeError) and
        "'_tkinter' has no attribute '__file__'" in str(cause2)):

        is_uv_python = "/uv/python" in (os.path.realpath(sys.executable))
        if is_uv_python:
            raise ImportError(
                "Failed to import tkagg backend. You appear to be using an outdated "
                "version of uv's managed Python distribution which is not compatible "
                "with Tk. Please upgrade to the latest uv version, then update "
                "Python with: `uv python upgrade --reinstall`"
                ) from e
        else:
            raise ImportError(
                "Failed to import tkagg backend. This is likely caused by using a "
                "Python executable based on python-build-standalone, which is not "
                "compatible with Tk. Recent versions of python-build-standalone "
                "should be compatible with Tk. Please update your python version "
                "or select another backend."
                ) from e
    else:
        raise


_log = logging.getLogger(__name__)
cursord = {
    cursors.MOVE: "fleur",
    cursors.HAND: "hand2",
    cursors.POINTER: "arrow",
    cursors.SELECT_REGION: "crosshair",
    cursors.WAIT: "watch",
    cursors.RESIZE_HORIZONTAL: "sb_h_double_arrow",
    cursors.RESIZE_VERTICAL: "sb_v_double_arrow",
}