为什么 tkinter(或海龟)似乎丢失或损坏?它不应该是标准库的一部分吗?

Kar*_*tel 19 python installation tkinter modulenotfounderror

当尝试使用 Tkinter 标准库包或其相关功能(海龟图形使用turtle和内置 IDLE IDE)或使用将此作为依赖项的第三方库(例如显示使用 Matplotlib 的图形窗口)。

似乎即使不存在因隐藏标准库模块名称而引起的问题(对于尝试遵循教程并使用海龟图形的初学者来说,这是一个常见问题 -示例 1示例 2示例 3示例 4),通常会发生标准库 Tkinter 无法工作的情况。这是一个大问题,因为许多初学者再次尝试遵循使用海龟图形的教程,并盲目地假设turtle标准库将会存在。

可能会报错:

当 Tkinter 被记录为标准库的一部分时,为什么会出现这样的问题?如何添加或修复缺少的标准库功能?对于特定的 Python 环境是否有任何特殊问题?


另请参阅:“UserWarning:Matplotlib 当前正在使用 agg,它是非 GUI 后端,因此无法显示该图。” 在 Pycharm 上使用 pyplot 绘制图形时。可以使用其他 GUI 后端与 Matplotlib 来显示图形;但如果TkAgg后端无法工作,那是因为 Tkinter 安装丢失或错误。

在Python 3.x 中,Tkinter 标准库模块的名称从 更正为Tkintertkinter即全部小写),以保持一致的命名约定。请使用tkinter 和 Tkinter 之间的差异来关闭由于尝试在 3.x 中使用旧名称(或在 2.x 中使用新名称)而引起的重复问题。这个问题是关于 Tkinter 实际上不可用的情况。如果不清楚哪种情况适用,请提供两个重复的链接,或将问题关闭为“需要调试详细信息”。

Kar*_*tel 33

警告:请勿用于pip尝试解决问题

Pip包管理器无法帮助解决这个问题。Python 标准库的任何部分(包括tkinterturtle)都不能从 PyPI 安装。出于安全原因,PyPI 现在阻止使用与标准库匹配的名称的包。

PyPI 上有许多包可能看起来合适,但实际上并不合适。大多数只是尝试向标准库 Tkinter 添加一些功能的包装器。然而,一个特别有问题的包是turtle. 它不应该在那里,因为当前的政策(自 2017 年以来)是阻止名称与标准库匹配的包;但它早在那之前就已上传,此后就没有维护过。它是Python 2.x 特定的代码,在 Python 3 上安装时会损坏,已经过时了(2009 年发布),而且最重要的是,它与海龟图形没有任何关系。我目前正在尝试将其从 PyPI 中除名。

为什么某些 Python 安装不包含 Tkinter 组件

Tkinter 丢失的原因有多种,具体取决于平台(尽管一般来说,动机可能只是为了节省空间)。

  • 当使用官方安装程序在 Windows 上安装 Python 时,可以选择包含或排除 Tcl/Tk 支持。

  • 根据发行版维护者的政策,随 Linux 预装的 Python 安装可能不包括 Tkinter 或各种组件。例如,我的 Linux 副本附带的 Python 包含turtle标准库,但不包含底层 Tkinter 包:

    >>> import turtle
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/usr/lib/python3.8/turtle.py", line 107, in <module>
        import tkinter as TK
    ModuleNotFoundError: No module named 'tkinter'
    
    Run Code Online (Sandbox Code Playgroud)

    其他版本可能也不包含该turtle模块。

  • 由于故意选择的配置选项,或者因为在开始编译之前缺少依赖项,从源代码构建的 Python 可能会缺少 Tkinter 支持。

请注意,虚拟环境通常与它们所基于的 Python 安装具有相同的 Tkinter 支持。但是,向基础添加 Tkinter 支持可能不会更新虚拟环境。在这种情况下,有必要从头开始重新创建虚拟环境。无法添加或删除对单个虚拟环境的 Tkinter 支持这是因为虚拟环境仅在站点包方面与其基础有所不同,并且 Tkinter 没有站点包(因为它是无法使用 Pip 获取的标准库组件)。

如何添加 Tkinter 支持,具体取决于环境

也可以看看

视窗

对于使用 python.org 的官方安装程序安装的 Python,请使用操作系统功能选择“修复”安装(或者,如果可以的话,卸载并重新安装 Python)。这次,请确保选中安装“tcl/tk 和 IDLE”可选功能的选项。

某些旧设置可能存在 32 位和 64 位版本的 Python 与 Tcl/Tk 之间冲突的问题。这不会对新设置造成问题。

有关可嵌入 zip 包,请参阅Python 可嵌入 zip:安装 Tkinter

Linux:Linux 发行版附带的 Python

如果您的 Linux 发行版附带的 Python 不包含 Tkinter,请考虑将其保留并安装单独版本的 Python - 只是一般原则。不过,一般来说,可以使用系统包管理器(而不是 Pip)将 Tkinter 支持添加到系统Python 中。

通常需要使用Python sudo(此处未包含在示例中)对系统进行此类更改。

  • 在基于Ubuntu 和 Debian的系统(包括 Pop!_OS、基于 Ubuntu 的 Mint)上:使用apt-get install python3-tk,假设系统 Python 是 3.x 版本。对于 2.x 遗留系统,请apt-get install python-tk改用。在某些情况下,可能需要指定次要版本,例如apt-get install python3.11-tk. 在某些情况下,自定义异常消息可能会说要安装python-tk,尽管python3-tk实际上应该安装。

  • 对于Fedora,请使用d-coder此处dnf install python3-tkinter所述的方法。

  • 对于Arch,请pacman -S tk按照 Jabba此处的描述进行使用。

  • 对于RHEL,请使用此处yum install python3-tkinteramzy-0 所描述的。

Linux:从源代码构建的 Python

上述软件包只能为系统python添加 Tkinter 支持(安装在 中的软件包/usr/bin,操作系统使用它来运行必要的脚本)。他们无法将 Tkinter 支持添加到从源代码构建的单独 Python 中。这是因为,除了_tkinter实际的 Tcl/Tk 库之外,在 Python 中使用 Tkinter 还需要一个每次安装的“绑定”库(在 Python 源代码中引用)。系统包不会将此库添加到其他 Python 安装中

因此,首先安装一个开发Tk 包(例如apt-get install tk-dev)并尝试重建。

也可以看看:

Brew(通常是 MacOS)

使用brew install python-tk; 如有必要,请指定 Python 版本,例如brew install python-tk@3.11.

对于非系统安装,可能需要重新安装并指定应包含 Tkinter 支持,例如brew install python --with-tcl-tk. 另请参阅:为什么通过 Homebrew 安装的 Python 不包括 Tkinter

无头环境

通常不可能为PythonAnywhereAmazon Linux EC2等无头服务器环境安装 Tkinter 或任何其他 GUI 工具包。该代码将在远程服务器上运行,因此没有监视器来显示 GUI;虽然原则上代码可以将命令发送回客户端,然后客户端可以使用该命令来创建 GUI,但通常服务器不会了解客户端的环境。要实现此功能,需要提前设置一些通信协议(例如 X11)。

虚拟环境

首先,修复虚拟环境所基于的安装。如果这不能解决问题,请重新创建虚拟环境(并重新安装旧虚拟环境中安装的所有内容)。不幸的是,没有一个干净的方法来解决这个问题。可以通过更改一堆符号链接来解决该问题,但这不受支持。

如果无法修复基本安装(例如,由于没有sudo系统权限),请考虑安装单独的 Python(例如,通过从源代码编译),确保它安装有 Tkinter 支持,并创建来自 Python虚拟环境。

Tkinter 组件

一些用户会发现准确了解 Tkinter 系统包含的内容很有用。有几个组成部分:

  • 底层 Tcl/Tk 库,用 C 编写。某些系统可能独立安装 Tcl/Tk,默认情况下无法从 Python 使用。

  • 实现_tkinter模块,也是用 C 编写的,是 Python 和 Tcl/Tk 之间的接口(“tkinter”意思是“Tk 接口”)。这是一个实现细节,不应直接在 Python 用户代码中导入。(此C 代码可以追溯到 1994 年!)

  • tkinter本身为较低级别的_tkinter界面提供了包装器,以及ttk(用于更新的“主题”小部件的单独界面)。

  • 更高级别的组件,例如 IDLE 和turtle.

理论上,任何给定的安装都可能缺少任何或所有这些组件。对于 Linux 和 MacOS 上的 Python 系统安装,发行版维护者负责确保适当的包(python3-tk或类似包)将默认情况下缺少的部分安装到适当的位置。

正如Terry Jan Reedy 在 GitHub 上向我解释的那样:当Windows安装程序被告知安装 Tcl/Tk 时,它将为该 Python安装安装该库的单独副本_tkinter(以及相应的等)。在 Linux 上,Tcl/Tk 通常会随 Linux 一起提供;像这样的包将添加一个使用系统 Tcl/Tk 的包,以及一个包(它会自然地找到并使用实现,使用正常的导入机制)。tkinterpython3-tk_tkintertkinter_tkinter

由于 Tcl/Tk 安装是针对 Windows“供应”的,因此 Tcl/Tk 版本将取决于 Python 版本。在 Linux 上,它将取决于系统,并且应该可以使用系统包管理器独立于 Python 来升级 Tcl/Tk。请特别注意,较新版本的 Python 可能无法与过时的系统 Tcl/Tk 一起使用。(要检查 Tcl/Tk 版本是否正常安装,请参阅如何确定我的 Linux 计算机上安装了哪个版本的 python3 tkinter?。


归档时间:

查看次数:

9813 次

最近记录:

2 年,4 月 前