警告:不要使用pip
尝试解决问题
Pip软件包管理器无法帮助解决问题。Python标准库的任何部分 - 包括tkinter
,turtle
等 - 都不能从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包括标准库,但不包括底层的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'
其他版本也可能不包括模块。
从源代码构建的Python可能会缺少Tkinter支持,因为配置选项是故意选择的,或者在开始编译之前缺少依赖项。
请注意,
虚拟环境通常具有与其基于的Python安装相同的Tkinter支持。但是,将Tkinter支持添加到基础程序中
可能不会更新虚拟环境。在这种情况下,需要从头重新创建虚拟环境。
无法为单个虚拟环境添加或删除Tkinter支持。这是因为虚拟环境仅在网站包方面与其基础程序不同,并且没有Tkinter的网站包(因为它是标准库组件,
无法使用Pip获得)。
如何根据环境添加Tkinter支持
另请参阅:
Windows
对于使用python.org官方安装程序安装的Python,请使用操作系统功能选择“修复安装”(或者,如果可行的话,卸载并重新安装Python)。 这次,请确保勾选“安装tcl/tk和IDLE”可选功能。
某些旧版本 可能存在Python和Tcl/Tk的32位和64位版本之间的冲突问题。这不会在新设置上引起问题。
对于可嵌入的zip包,请参见Python可嵌入zip:安装Tkinter。
Linux:随Linux发行版提供的Python
如果随Linux发行版提供的Python不包括Tkinter,则可以考虑放弃该版本并安装单独的Python版本 - 凭借一般原则。然而,通常情况下,可以使用系统软件包管理器(而非Pip)向系统Python添加Tkinter支持。
通常需要使用sudo
(本文未包含在示例中)来进行对系统Python的更改。
在基于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,请使用
dnf install python3-tkinter
,如d-coder
此处所述。
对于Arch,请使用
pacman -S tk
,如Jabba
此处所述。
对于RHEL,请使用
yum install python3-tkinter
,如amzy-0
此处所述。
Linux: 从源代码构建Python
上述软件包只能为系统中的Python(安装在/usr/bin
目录下,由操作系统用于运行必要脚本)添加Tkinter支持。它们无法为从源代码构建的独立Python添加Tkinter支持。这是因为,在Python中使用Tkinter除了实际的Tcl/Tk库之外,还需要一个每次安装都会生成的“绑定”库(在Python源代码中称为_tkinter
)。系统软件包不会将此库添加到其他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
无头环境
一般来说,在像PythonAnywhere或Amazon Linux EC2这样的无头服务器环境中,是不可能安装Tkinter或任何其他GUI工具包的。代码将在远程服务器上运行,因此没有显示GUI的监视器;虽然原则上代码可以发送命令回到客户端,然后客户端可以使用这些命令创建GUI,但通常情况下,服务器将不知道客户端的环境。使其正常工作需要预先设置某些通信协议(例如X11)。
虚拟环境
首先,修复虚拟环境所基于的安装。如果这不能解决问题,重新创建虚拟环境(并重新安装旧虚拟环境中安装的所有内容)。不幸的是,没有一个干净的解决方法。也许通过改变一堆符号链接来绕过问题是可能的,但这并不受支持。
如果无法修复基本安装(例如,由于系统上没有
sudo
权限),
考虑安装单独的Python(例如,通过源代码编译),确保它安装了Tkinter支持,并从
该 Python创建虚拟环境。
Tkinter组件
一些用户会发现了解Tkinter系统包含的内容非常有用。有几个组件:
底层的C语言编写的Tcl/Tk库。一些系统可能会独立安装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
和 tkinter
等)。在 Linux 上,Tcl/Tk 通常会随 Linux 一起提供;像 python3-tk
这样的软件包将添加使用系统 Tcl/Tk 的 _tkinter
,以及一个 tkinter
软件包(自然会找到并使用 _tkinter
实现,使用正常的导入机制)。
由于在Windows上Tcl/Tk安装是“vendored”,因此Tcl/Tk版本将取决于Python版本。在Linux上,它将取决于系统,并且应该可以使用系统包管理器独立升级Tcl/Tk而不影响Python。特别注意的是,较新版本的Python可能无法与过时的系统Tcl/Tk配合使用。(要检查工作安装的Tcl/Tk版本,请参见如何确定我的Linux机器上安装了哪个版本的python3 tkinter?。)