为什么 tkinter (或 turtle) 似乎缺失或损坏了?它不应该是标准库的一部分吗?
- 2024-11-20 08:44:00
- admin 原创
- 10
问题描述:
当我尝试使用 Tkinter 标准库包或其相关功能(使用海龟图形turtle
和内置的 IDLE IDE)或者以此为依赖项的第三方库(例如使用 Matplotlib 显示图形窗口)时,我看到许多不同的情况出错。
似乎即使没有因隐藏标准库模块名称而导致的问题(对于尝试按照教程并使用海龟图形的初学者来说,这是一个常见问题 -示例 1;示例 2;示例 3;示例 4),标准库 Tkinter 也经常不起作用。这是一个大问题,因为很多初学者尝试按照使用海龟图形的教程进行操作,并盲目地认为turtle
标准库会存在。
可能会报如下错误:
与
ModuleNotFoundError: No module named 'tkinter'
;或ImportError
具有相同消息;或具有不同大小写(我知道名称从Tkinter
2.x 更改为tkinter
3.x;这是一个不同的问题)。类似地,但引用内部
_tkinter
模块,并显示带有注释的代码,注释为“如果失败,您的 Python 可能未配置为 Tk”;或带有自定义错误消息,注释为“请安装 python-tk 包”或类似内容。当尝试使用时出现“没有
turtle
名为turtle 的模块” ,或者上述错误之一。当尝试使用 Matplotlib 显示图表时;通常,这会在尝试更改后端后发生,后端默认设置以避免尝试使用 Tkinter。
为什么会出现这样的问题,而 Tkinter 被记录为标准库的一部分?如何添加或修复缺少的标准库功能?对于特定的 Python 环境有什么特别的关注吗?
另请参阅:在 Pycharm 上使用 pyplot 绘制图形时出现“UserWarning:Matplotlib 当前正在使用 agg,这是一个非 GUI 后端,因此无法显示图形。”。可以使用其他 GUI 后端与 Matplotlib 一起显示图形;但如果TkAgg
后端不起作用,那是因为缺少或安装有故障的 Tkinter。
在 Python 3.x 中,Tkinter 标准库模块的名称从 更正为Tkinter
(tkinter
即全部小写),以保持一致的命名约定。请使用tkinter 和 Tkinter 之间的差异来关闭由于尝试在 3.x 中使用旧名称(或在 2.x 中使用新名称)而导致的重复问题。此问题是关于 Tkinter 实际上不可用的情况。如果不清楚哪种情况适用,请提供两个重复链接,或将问题关闭为“需要调试详细信息”。
解决方案 1:
警告:请勿使用pip
来尝试解决问题
Pip 包管理器无法帮助解决该问题。Python 标准库的任何部分(包括tkinter
等turtle
)都无法从 PyPI 安装。出于安全原因,PyPI 现在会阻止使用与标准库匹配的名称的包。
PyPI 上有许多软件包可能看起来合适,但实际上并非如此。大多数只是包装器,试图为标准库 Tkinter 添加一些功能。但是,一个特别有问题的包是turtle
。它不应该在那里,因为当前的政策(自 2017 年以来)是阻止名称与标准库匹配的包;但它在那之前很久就上传了,从那时起就没有维护过。它是Python 2.x 特定的代码,在Python 3 上安装时会中断,非常过时(2009 年发布),最重要的是 -与海龟图形毫无关系。
在这篇问答的初稿发表前不久,我提交了一份请求,要求将该turtle
软件包从 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 支持可能不会更新虚拟环境。在这种情况下,需要从头开始重新创建虚拟环境。无法为单个虚拟环境添加或删除 Tkinter 支持。这是因为虚拟环境仅在站点包方面与其基础环境不同,并且没有 Tkinter 的站点包(因为它再次成为无法使用 Pip 获取的标准库组件)。
如何添加 Tkinter 支持(取决于环境)
另请参阅:
Tk 官方文档中的指南:https ://tkdocs.com/tutorial/install.html
该问题的一些先前版本(现已重复)及其有用的答案:
为 Python 安装 tkinter
Tkinter:“Python 可能未针对 Tk 配置”
导入错误:没有名为“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 中。
通常需要使用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,使用,如 d-coder在此处
dnf install python3-tkinter
所述。对于Arch,使用方式如 Jabba在此处
pacman -S tk
所述。对于RHEL,使用,如 amzy-0在此处
yum install python3-tkinter
所述。
Linux:从源代码构建的 Python
上述软件包只能将Tkinter 支持添加到系统Python(安装在 中的 Python /usr/bin
,操作系统使用它来运行基本脚本)。它们无法将 Tkinter 支持添加到从源代码构建的单独 Python。这是因为,除了实际的 Tcl/Tk 库之外,在 Python 中使用 Tkinter 还需要一个安装前“绑定”库(在 Python 源代码中称为_tkinter
)。系统软件包不会将此库添加到其他 Python 安装中。
因此,首先安装一个开发Tk 包(例如apt-get install tk-dev
)并尝试重建。
参见:
无法在 MacOS 上使用 pyenv Pythons 安装 tkinter(使用
pyenv
)本地安装 tkinter 和 python(以防
sudo
权限不可用)构建 Python 以及更多关于缺失模块的内容(一般是关于从源代码重建 Python 以及填充开发依赖项)
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 组件
有些用户会发现准确了解 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
和tkinter
等)。在 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 版本,请参阅如何确定我的 Linux 机器上安装了哪个版本的 python3 tkinter?。)
解决方案 2:
venv
希望这能帮助像我一样在同一系统上使用多个 Python 版本(例如 3.8、3.9 和 3.10)的人。假设你venv
使用特定的 Python 版本创建了你的,但无法导入tkinter
:
$ python3.10 -m venv my_venv_1 #create a venv with python 3.10
$ source my_venv_1/bin/activate
$ python
Python 3.10.11 (main, Apr 5 2023, 14:15:10) [GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tkinter
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'tkinter'
>>> quit()
$ deactivate
您可以专门安装tkinter
与您之前创建的 Python 版本相匹配的 Python 版本venv
。例如在 ubuntu 上,您需要tkinter
使用以下命令专门安装现有系统范围的 Python 3.10:
sudo apt-get install python3.10-tk
现在如果你激活venv
已经创建的,tkinter
它将被自动拾取:
source my_venv_1/bin/activate
python
>>>import tkinter as tk
>>>
成功!
解决方案 3:
只是补充上述答案。我使用以下内容通过 pyenv https://github.com/pyenv/pyenv解决了 macos 上安装 python 的问题。
# check python installation
python --version
which python
# uninstall python version in pyenv
pyenv uninstall 3.12.4
# setup tcl tk via homebrew
brew install python-tk
# reinstall pyenv
pyenv install 3.12.4
# it should display that it picks up tcl-tk from homebrew
... Installing Python-3.12.4...
... python-build: use tcl-tk from homebrew
# now test if tkinter works (you should see a popup)
python -c "import tkinter; tkinter._test()"
按顺序执行上述步骤。需要注意的几点是使用python-tk
brew 而不是tcl-tk
,它允许 python 的构建自动获取--with-tcl-tk
参数。
正如其他人所述,这里的主要问题是,tkinter
尽管它是 Python 中的标准库,但它实际上是 tcl tk gui 工具包的接口,该工具包可能在您的系统中,也可能不在。因此,您需要根据您的操作系统进行设置。对于其他操作系统,有几种答案,但这里,这是一个在 macos 中对我有用的示例。
希望这有帮助。您可以在此处阅读更多相关信息: https: //docs.python.org/3/library/tkinter.html
解决方案 4:
标准故障排除步骤
在得出 Tkinter 需要在某处安装的结论之前,请确保以下内容。
首先,尝试在这个程序中使用 Tkinter是否有意义?特别是,Web 应用程序和类似的客户端-服务器应用程序通常不应尝试在服务器上使用任何类型的桌面 GUI 工具包 - 包括 Tkinter。服务器通常没有物理显示器,最终用户无论如何都看不到它;大多数服务器托管不会在所谓的“无头”服务器上的 Python 支持中包含 Tkinter 等。
尝试以这种方式将 GUI “发送” 到客户端通常也没有意义。在 Web 应用程序中,数据 (HTML/CSS/Javascript) 将发送到 Web 浏览器,然后由该浏览器创建 UI。对于将数据发送到服务器的独立程序,客户端应实现 GUI,并使用其自己的逻辑来解释从服务器发送的数据,以便更新 GUI 小部件。服务器尝试“控制”客户端上的应用程序是没有意义的。
对于 Matplotlib 和可选择显示 GUI 内容的类似库,需要特别注意的是:可能不需要专门使用 Tkinter 来查看 GUI 结果,而且可能无需 GUI 即可解决问题。具体来说,可以指示 Matplotlib 使用非 GUI“后端”,然后将图形保存到图像文件中,而不是将它们显示在屏幕上(这通常更有用)。还可以指示它使用除 Tkinter 之外的其他 GUI 后端。有关详细信息,请参阅:
+ 在 Pycharm 上使用 pyplot 绘制图形时出现“UserWarning:Matplotlib 当前正在使用 agg,这是一个非 GUI 后端,因此无法显示图形。”
+ 当 DISPLAY 未定义时使用 matplotlib 生成 PNG
+ 如何在 matplotlib/Python 中更改后端
+ _tkinter.TclError:没有显示名称,也没有 $DISPLAY 环境变量
import
对于这个版本的 Python, 的拼写正确吗?2.x代码默认必须引用Tkinter
,但 3.x 必须引用tkinter
。代码使用的是哪个 Python 安装?就像运行错误的 Python 可能出错的所有其他情况一样(即:为该 Python 安装了错误的第三方库,版本与代码不兼容),给定机器上的某些 Python 安装可能支持 Tkinter,而其他则不支持。
特别要注意的是,在 Linux 上,仅仅因为系统上安装了 Tcl/Tk并不意味着每个 Python 安装都可以访问它。每个安装都需要添加 Tkinter 支持。
这可能与上一个问题相关:假设给定的计算机同时安装了 2.x 和 3.x 版本。即使 Tkinter 可用于两者,尝试使用错误版本运行代码也会导致ImportError
(假设没有SyntaxError
第一个,例如尝试print
在 3.x 中用作语句)。
如果某些 Python 安装在特定系统上不支持 Tkinter,只需确保 Tkinter 代码与支持 Tkinter 的安装一起运行。
特别要注意的是,虚拟环境算作单独的 Python 安装。通常,如果虚拟环境是从在创建虚拟环境时具有Tkinter 支持的基础安装创建的,则它们将具有 Tkinter 支持。通常,无法将 Tkinter 支持直接添加到虚拟环境中。请记住,其他第三方工具(例如 PyCharm 等 IDE、Poetry 等构建工具链工具以及环境管理工具等)可能会创建虚拟环境 - 请阅读文档并确保它们的工作原理。pyenv
解决方案 5:
特殊环境
这是社区 wiki 答案,旨在汇总处理非标准 Python 安装的答案。请编辑以添加相关信息。首先,我提供了一些关于这些环境的先前特定问题的链接,无论这些问题是否得到了适当的回答。
的阿巴库斯
在Abaqus 6.12-1中使用Tkinter导入出错
python3-dbg
(gdb 提供的调试版本?)
GDB:ModuleNotFoundError:没有名为“_tkinter”的模块
地理信息系统
ModuleNotFoundError:QGIS 中没有名为“_tkinter”的模块
深思之冠
在 Canopy 中安装 tkinter 时出现问题
蟒蛇
无法使用 Mac OSX 10.8.3 在 python 中导入 tkinter(?)
派派
IronPython / Python.NET
使用 PyInstaller 等创建的捆绑可执行文件。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件