警告:请勿使用pip
尝试解决问题
Pip包管理器无法帮助解决这个问题。 Python 标准库的任何部分 - 包括tkinter
, turtle
等 - 可以从 PyPI 安装。出于安全原因,PyPI 现在阻止使用与标准库匹配的名称的包。
PyPI 上有许多包可能看起来合适,但实际上并不合适。大多数只是尝试向标准库 Tkinter 添加一些功能的包装器。然而,一个特别有问题的包是turtle
。它不应该在那里,因为当前政策(自 2017 年起)是阻止名称与标准库匹配的包 https://github.com/pypi/warehouse/issues/2151;但它早在那之前就已上传,此后就没有维护过。这是Python 2.x 的具体代码安装过程中会损坏 https://stackoverflow.com/questions/55318093在 Python 3 上,是极其过时(2009 年出版) - 最重要的是 -与乌龟图形无关. I am 目前正在尝试 https://github.com/pypi/support/issues/2771将其从 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'
其他版本可能不包括turtle
模块也可以。
-
由于故意选择的配置选项,或者因为在开始编译之前缺少依赖项,从源代码构建的 Python 可能会缺少 Tkinter 支持。
注意虚拟环境通常与它们所基于的 Python 安装具有相同的 Tkinter 支持。但是,向基础添加 Tkinter 支持可能不会更新虚拟环境。在这种情况下,有必要从头开始重新创建虚拟环境。It is 无法添加或删除对单个虚拟环境的 Tkinter 支持 https://unix.stackexchange.com/questions/738583.这是因为虚拟环境仅在站点包方面与其基础有所不同,并且 Tkinter 没有站点包(因为它又是一个标准库组件,无法使用Pip获取).
如何添加 Tkinter 支持,具体取决于环境
See also:
- Tk 官方文档中的指南:https://tkdocs.com/tutorial/install.html https://tkdocs.com/tutorial/install.html
- Some previous (now duplicate) versions of the question with some useful answers:
- 安装 Python 版 tkinter https://stackoverflow.com/questions/4783810
- Tkinter:“Python 可能未针对 Tk 配置” https://stackoverflow.com/questions/5459444
- 导入错误:没有名为“Tkinter”的模块 https://stackoverflow.com/questions/25905540
Windows
对于使用 python.org 的官方安装程序安装的 Python,请使用操作系统功能来选择“修复”安装(或者,如果可以的话,卸载并重新安装 Python)。这次,一定要勾选安装“tcl/tk and IDLE”选项可选功能。
一些遗留设置可能存在 32 位和 64 位版本的 Python 与 Tcl/Tk 之间冲突的问题 https://stackoverflow.com/questions/8724729。这不会对新设置造成问题。
对于可嵌入的 zip 包,请参阅Python 可嵌入 zip:安装 Tkinter https://stackoverflow.com/questions/37710205 .
Linux:Linux 发行版附带的 Python
如果您的 Linux 发行版附带的 Python 不包含 Tkinter,请考虑将其保留并安装单独版本的 Python - 只是一般原则。不过,一般来说,Tkinter 支持可以添加到systemPython 使用系统包管理器(不是 Pip).
It will 通常需要使用sudo
(此处未包含在示例中)对系统 Python 进行此类更改。
-
On 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
. 在某些情况下 https://stackoverflow.com/questions/9532547,自定义异常消息可能会提示安装python-tk
虽然python3-tk
实际上应该安装。
-
For Fedora, use dnf install python3-tkinter
,如 d-coder 所描述here https://stackoverflow.com/a/25905642.
-
For Arch, use pacman -S tk
正如贾巴所描述的here https://stackoverflow.com/a/36901234.
-
For RHEL, use yum install python3-tkinter
,如 amzy-0 所描述here https://stackoverflow.com/a/66292120.
Linux:从源代码构建的 Python
以上套餐都可以only添加 Tkinter 支持systempython(安装在/usr/bin
,操作系统使用它来运行必要的脚本)。他们cannot将 Tkinter 支持添加到从源代码构建的单独 Python 中。这是因为,此外实际的 Tcl/Tk 库,在 Python 中使用 Tkinter 需要一个每次安装的“绑定”库(称为_tkinter
在 Python 源代码中)。系统包不会将此库添加到其他Python安装中.
所以,安装一个发展Tk包先 (e.g. apt-get install tk-dev
)并尝试重建。
也可以看看:
-
无法在 MacOS 上使用 pyenv Python 安装 tkinter https://stackoverflow.com/questions/60469202 (using pyenv
)
-
本地安装 tkinter 和 python https://stackoverflow.com/questions/11948295(以防万一sudo
权限不可用)
-
在缺失的模块上构建 Python 等 https://stackoverflow.com/questions/6171210(更一般地说,是关于从源代码重建 Python 并填充开发依赖项)
Brew(通常是 MacOS)
Use brew install python-tk
;如有必要,请指定 Python 版本,例如brew install [email protected] /cdn-cgi/l/email-protection
.
对于非系统安装,可能需要重新安装并指定应包含 Tkinter 支持,例如brew install python --with-tcl-tk
。也可以看看:为什么通过 Homebrew 安装的 Python 不包含 Tkinter https://stackoverflow.com/questions/36760839
无头环境
It's 通常不可能安装 Tkinter - 或任何其他 GUI 工具包 - for 无头服务器环境,例如 PythonAnywhere https://help.pythonanywhere.com/pages/TkinterPygameEtc or 亚马逊 Linux EC2 https://stackoverflow.com/questions/40675417。该代码将在远程服务器上运行,因此没有监视器来显示 GUI;虽然原则上代码可以将命令发送回客户端,然后客户端可以使用该命令来创建 GUI,但通常服务器不会了解客户端的环境。要实现这项工作,需要提前设置一些通信协议(比如X11 https://unix.stackexchange.com/questions/276168/what-is-x11-exactly).
虚拟环境
First, 修复虚拟环境所基于的安装。如果这不能解决问题,重新创建虚拟环境(并重新安装旧虚拟环境中安装的所有内容)。不幸的是,没有一个干净的方法来解决这个问题。可以通过更改一堆符号链接来解决该问题,但这不受支持。
如果无法修复基本安装(例如,由于没有sudo
系统权限),考虑安装单独的Python(例如,通过从源代码编译),确保安装了 Tkinter 支持,并从创建虚拟环境that Python.
Tkinter 组件
一些用户会发现准确了解 Tkinter 系统包含的内容很有用。有几个组成部分:
-
底层 Tcl/Tk 库,用 C 编写。某些系统可能独立安装 Tcl/Tk,默认情况下无法从 Python 使用。
-
The _tkinter
实现模块,也是用 C 编写的,是 Python 和 Tcl/Tk 之间的接口(“tkinter”意思是“Tk 接口”)。这是一个实现细节,不应直接在 Python 用户代码中导入。 (这C code https://github.com/python/cpython/blob/main/Modules/_tkinter.c因为这可以追溯到 1994 年!)
-
The tkinter
包本身,它为较低层提供包装器_tkinter
接口,以及ttk
(用于更新的“主题”小部件的单独界面)。
-
更高级别的组件,例如 IDLE 和turtle
.
理论上,任何给定的安装都可能缺少任何或所有这些组件。对于 Linux 和 MacOS 上的 Python 系统安装,发行版维护者负责确保适当的包(python3-tk
或类似)将默认情况下缺少的部件安装到适当的位置。
As Terry Jan Reedy 在 GitHub 上向我解释 https://github.com/python/cpython/issues/102501: 当。。。的时候Windows安装程序被告知安装 Tcl/Tk,它将安装一个单独的副本该库(以及相应的_tkinter
and tkinter
等)用于Python安装。在 Linux 上,Tcl/Tk 通常会随 Linux 一起提供;类似的包python3-tk
将添加一个_tkinter
使用系统 Tcl/Tk 和tkinter
包(它自然会找到并使用_tkinter
实现,使用正常的导入机制)。
由于 Tcl/Tk 安装是针对 Windows“供应”的,因此 Tcl/Tk 版本将取决于 Python 版本。在 Linux 上,这取决于系统,并且应该可以使用系统包管理器独立于Python来升级Tcl/Tk。请特别注意,较新版本的 Python 可能无法与过时的系统 Tcl/Tk 一起使用。 (检查Tcl/Tk版本用于工作安装, see 如何确定我的 Linux 机器上安装了 python3 tkinter 的版本? https://stackoverflow.com/questions/35999344 .)