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

2024-11-20 08:44:00
admin
原创
10
摘要:问题描述:当我尝试使用 Tkinter 标准库包或其相关功能(使用海龟图形turtle和内置的 IDLE IDE)或者以此为依赖项的第三方库(例如使用 Matplotlib 显示图形窗口)时,我看到许多不同的情况出错。似乎即使没有因隐藏标准库模块名称而导致的问题(对于尝试按照教程并使用海龟图形的初学者来说,这...

问题描述:

当我尝试使用 Tkinter 标准库包或其相关功能(使用海龟图形turtle和内置的 IDLE IDE)或者以此为依赖项的第三方库(例如使用 Matplotlib 显示图形窗口)时,我看到许多不同的情况出错。

似乎即使没有因隐藏标准库模块名称而导致的问题(对于尝试按照教程并使用海龟图形的初学者来说,这是一个常见问题 -示例 1;示例 2;示例 3;示例 4),标准库 Tkinter 也经常不起作用。这是一个大问题,因为很多初学者尝试按照使用海龟图形的教程进行操作,并盲目地认为turtle标准库会存在。

可能会报如下错误:

  • ModuleNotFoundError: No module named 'tkinter';或ImportError具有相同消息;或具有不同大小写(我知道名称从Tkinter2.x 更改为tkinter3.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 标准库模块的名称从 更正为Tkintertkinter即全部小写),以保持一致的命名约定。请使用tkinter 和 Tkinter 之间的差异来关闭由于尝试在 3.x 中使用旧名称(或在 2.x 中使用新名称)而导致的重复问题。此问题是关于 Tkinter 实际上不可用的情况。如果不清楚哪种情况适用,请提供两个重复链接,或将问题关闭为“需要调试详细信息”。


解决方案 1:

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

Pip 包管理器无法帮助解决该问题。Python 标准库的任何部分(包括tkinterturtle)都无法从 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-tkpython3-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 安装安装该库的单独副本(以及相应的_tkintertkinter等)。在 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-tkbrew 而不是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 等创建的捆绑可执行文件。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用