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

2024-01-27

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

似乎即使没有隐藏标准库模块名称引起的问题 https://stackoverflow.com/questions/36250353(对于尝试遵循教程并使用海龟图形的初学者来说,这是一个常见问题 -示例1 /q/60480328; 示例2 /q/17530140; 实施例3 /q/53692691; 实施例4 /q/32180949), 标准库 Tkinter 无法正常工作是很常见的情况。这是一个大问题,因为很多初学者再次尝试遵循使用海龟图形的教程,并盲目地假设turtle标准库将会出现。

可能会报错:

  • As ModuleNotFoundError: No module named 'tkinter' https://stackoverflow.com/questions/25905540; or an ImportError具有相同的消息;或使用不同的外壳(我知道名称更改为Tkinter在 2.x 中tkinter in 3.x https://stackoverflow.com/questions/17843596;这是一个不同的问题)。

  • 同样,但是指的是内部的_tkinter module https://stackoverflow.com/questions/5459444,并显示带有注释的代码“如果失败,您的 Python 可能无法配置 Tk”;或者带有自定义错误消息 https://stackoverflow.com/questions/15884075上面写着“请安装 python-tk 包”或类似内容。

  • 作为“没有名为turtle的模块”当尝试使用时turtle具体来说 https://stackoverflow.com/questions/55318093,或上述错误之一。

  • 尝试使用 Matplotlib 显示绘图时 /q/56656777;通常,这种情况会在尝试更改后端后发生,默认设置是为了避免尝试使用 Tkinter。

为什么会出现这样的问题,当 Tkinter 为记录为标准库的一部分 https://docs.python.org/3/library/tk.html?我怎么能够添加或修复缺失的标准库功能?对于特定的 Python 环境是否有任何特殊问题?


See also: "UserWarning: Matplotlib is currently using agg, which is a non-GUI backend, so cannot show the figure." when plotting figure with pyplot on Pycharm https://stackoverflow.com/questions/56656777 . It is possible to use other GUI backends with Matplotlib to display graphs; but if the TkAgg backend does not work, that is because of a missing or faulty Tkinter install.

In Python 3.x, the name of the Tkinter standard library module was corrected from Tkinter to tkinter (i.e., all lowercase) in order to maintain consistent naming conventions. Please use Difference between tkinter and Tkinter https://stackoverflow.com/questions/17843596 to close duplicate questions caused by trying to use the old name in 3.x (or the new name in 2.x). This question is about cases where Tkinter is not actually available. If it isn't clear which case applies, please either offer both duplicate links, or close the question as "needs debugging details".


警告:请勿使用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 .)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 存储为 np.arrays 的不同数据集的分组堆积条形图

    我正在研究一个平衡问题 我想比较一些数据 我想通过创建不同年份的堆叠条形图来做到这一点 每年 我想要两个不同数据集的堆叠条形图 我正在尝试创建一种 分组堆积条形图 我设法创建了我想要比较的 2 个堆叠条形图 但它们仍然位于两个不同的图中 我
  • from __future__ importabsolute_import 实际上做了什么?

    I have answered https stackoverflow com a 22679558 2588818一个关于Python中绝对导入的问题 我认为我通过阅读理解了这个问题Python 2 5 变更日志 https docs p
  • Python Numpy TypeError:输入类型不支持 ufunc 'isfinite'

    这是我的代码 def topK dataMat sensitivity meanVals np mean dataMat axis 0 meanRemoved dataMat meanVals covMat np cov meanRemov
  • 有没有办法离线将多个 Plotly HTML 文件合并/嵌入到一个页面/HTML 文件中?

    我正在尝试将多个图表合并成一个 HTML 报告来发送 问题是我真的不认为子图是最好的主意 因为图表相对不相关 不同的 X Y 轴 我所需要做的只是将图表附加到 1 个 HTML 文件中 有一个指南解释了如何使用绘图 URL 来完成此操作 但
  • Python:我可以修改元组吗?

    我有一个 2 D 元组 实际上我以为 它是一个列表 但错误说它是一个元组 但无论如何 该元组的形式为 浮点数 val prod id 现在我有一个字典 其中包含 key gt prod id 和 value prod name 现在 我想将
  • 在 Windows 上使用 Python 打开设备句柄

    我正在尝试使用 Giveio sys 驱动程序 该驱动程序需要先打开一个 文件 然后才能访问受保护的内存 我正在查看 WinAVR AVRdude 中的 C 示例 它使用以下语法 define DRIVERNAME giveio HANDL
  • 不要在异常堆栈中显示 Python raise-line

    当我在 Python 库中引发自己的异常时 异常堆栈将引发行本身显示为堆栈的最后一项 这显然不是一个错误 在概念上是正确的 但是当您在外部使用代码 例如作为模块 时 它会将重点放在对调试无用的东西上 有没有办法避免这种情况并强制 Pytho
  • 如何将当前日期分配给 odoo v8 中的日期字段?

    我想将当前日期分配给以下代码中的日期字段 start date calendar obj create cr uid name rec res act ion user id rec res asgnd to id start date l
  • 为什么通过selenium切换到alert不稳定?

    为什么通过selenium切换到alert不稳定 例如 1 运行代码 一切顺利 一切都很顺利 但如果这段代码在几分钟内运行 那么可能会出现错误 例如 没有可以单击的元素 等等 2 在一个站点上有一个警报窗口 alert driver swi
  • Unpickle 二进制文件为文本[重复]

    这个问题在这里已经有答案了 我需要对基本上如下所示的系统进行一些维护 复杂的遗留Python程序 gt 二进制pickle文件 gt 另一个复杂的遗留Python程序 这需要准确弄清楚中间 pickle 文件中的内容 我怀疑文件格式比生成和
  • 在用户提交的正则表达式中查找捕获组

    我有一个 python 应用程序 需要处理用户提交的正则表达式 出于性能考虑 我想禁止捕获组和反向引用 我的想法是使用另一个正则表达式来验证用户提交的正则表达式不包含任何命名或未命名的组捕获 如下所示 def validate user r
  • 没有名为 objc 的模块

    我正在尝试将 cocoa python 与 Xcode 一起使用 但它总是会出现错误 Traceback most recent call last File main py line 10 in
  • 插入失败“OperationalError:没有这样的列”

    我尝试使用我尝试修复的姓名和电话创建一个数据库 但它会随时向我重播 File exm0 py line 14 in
  • numpy.polyfit 没有关键字“cov”

    我试图使用 polyfit 来找到一组数据的最佳拟合直线 但我还需要知道参数的不确定性 所以我也想要协方差矩阵 在线文档建议我写 polyfit x y 2 cov True 但这给出了错误 类型错误 polyfit 得到了意外的关键字参数
  • python中不规则点之间的坐标列表

    想象一下 我们为 x 和 y 随机选择两个介于 0 到 100 之间的点 例如 95 7 35 6 现在使用简单的 pygame draw line 函数 我们可以轻松地在这些点之间绘制一条没有任何间隙的线 我的问题是 我们如何找到两点之间
  • Kivy:滚动缩放

    有没有办法在桌面 kivy 应用程序上放大图像 例如使用鼠标滚轮缩放 这里似乎讨论过 https github com kivy kivy issues 3563 https github com kivy kivy issues 3563
  • 为什么这个记忆器适用于递归函数?

    我不明白为什么下面的代码是这样的fib以线性而非指数时间运行 def memoize obj Memoization decorator from PythonDecoratorLibrary Ignores kwargs cache ob
  • 嵌套 for 循环以列出具有不同“if”条件的理解

    我正在尝试将此嵌套循环转换为列表理解 但我不确定是否可能 因为 tmp 列表中的项目可能有不同的值 这是最好的方法吗 谢谢 final for a in range 13 1 for b in range 0 4 for c in rang
  • Mac OS 上的 pybluez 安装错误

    我尝试安装pybluez使用以下命令 pip install pybluez sudo easy install pybluez 但对于这两个命令我最终都会出错 环境 Mac OSX 10 9 1 Python 2 7 点日志 cc fno
  • 帮助我在 Python 中实现反向传播

    EDIT2 新的训练集 Inputs 0 0 0 0 0 0 1 0 0 0 2 0 0 0 3 0 0 0 4 0 1 0 0 0 1 0 1 0 1 0 2 0 1 0 3 0 1 0 4 0 2 0 0 0 2 0 1 0 2 0 2

随机推荐