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

2024-01-03

当尝试使用 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(或海龟)似乎丢失或损坏?它不应该是标准库的一部分吗? 的相关文章

  • C++ 相当于 Python getattr

    在Python中 有一个名为getattr的函数 它看起来像这样 class MyObject def init self self xyz 4 obj MyObject getattr obj xyz 其中对 getattr 的调用将返回
  • Python Numpy TypeError:输入类型不支持 ufunc 'isfinite'

    这是我的代码 def topK dataMat sensitivity meanVals np mean dataMat axis 0 meanRemoved dataMat meanVals covMat np cov meanRemov
  • 在Python中解析空选项

    我有一个应用程序 允许您将事件数据发送到自定义脚本 您只需布置命令行参数并指定什么事件数据与什么参数相匹配 问题是这里没有真正的灵活性 您制定的每个选项都将被使用 但并非每个选项都必须有数据 因此 当应用程序构建要发送到脚本的字符串时 某些
  • python列表理解和extend() [重复]

    这个问题在这里已经有答案了 深入学习 Python 2 7 1 但未能理解这一点 几个小时 gt gt gt a 1 2 gt gt gt b 3 4 gt gt gt gt gt gt a extend b 0 gt gt gt a 1
  • 不要在异常堆栈中显示 Python raise-line

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

    在 python 中 我通常简单地循环遍历范围 for i in range 100 do something 但现在我想跳过循环中的几个步骤 更具体地说 我想要类似的东西continue 10 这样它就会跳过整个循环并将计数器增加 10
  • 在 python 中返回 self [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个代表对象的类 我有很多方法可以修改这个对象状态 没有明显的返回或显然没有任何返回 在 C 中 我会将所有这些方法声明为void
  • 如何从 python 脚本更改 python 文件中的变量值

    我目前有一个 python 文件 其中包含一堆带有值的全局变量 我想从一个单独的 python 脚本永久更改这些值 我尝试过 setattr 等 但似乎不起作用 有没有办法做到这一点 简短的回答是 不 不值得这么麻烦 听起来您正在尝试创建一
  • 使用 boto 和 python 从带有参数的布局创建 mTurk HIT

    我正在尝试利用 boto 在 Mechanical Turk 中生成 HIT 目标是使用我的 mTurk 帐户上已生成的通用布局 并向其传递图像 URL 以迭代创建 HIT 问题是 即使正确命名参数 如果图像 url boto 也不成功 我
  • 如何在 Python 中重命名文件并保留创建日期

    我知道创建日期不存储在文件系统本身中 但是当我使用时我遇到了问题os rename 它正在更新我正在使用的文件的创建日期 是否可以重命名文件而不更改其原始创建日期 正如都铎所说 你可以使用os stat http docs python o
  • 没有名为 objc 的模块

    我正在尝试将 cocoa python 与 Xcode 一起使用 但它总是会出现错误 Traceback most recent call last File main py line 10 in
  • 有没有办法在Python中调用子类定义的方法?

    The init 方法定义了创建类的实例时要执行的操作 创建子类时我可以做类似的事情吗 假设我有抽象类Entity class Entity def onsubclasscreation cls for var in cls annotat
  • 来自字典列表列表的 Pandas DataFrame

    我有一个数据结构 它是字典列表的列表 Height 86 Left 1385 Top 215 Width 86 Height 87 Left 865 Top 266 Width 87 Height 103 Left 271 Top 506
  • 如何使用Django模板作为组件?

    我有 5 个模板 index html detail html tag html login html register html and a 基本 html 所有 5 个模板都会扩展基本 html 索引 html 详细信息 html 标签
  • 如何在Python中设置像素的alpha值

    我正在尝试编辑image https drive google com file d 0B8JcwRV HVk0OURrcTFJczhmV2RlUGdMOG0ybldYUVRoamtF view usp sharing以一种将所有白色像素转
  • 对二进制数的字符串表示进行按位运算 python 2.7

    我想对二进制数的两个字符串表示执行按位或 但我不知道如何将字符串转换为原始二进制 a 010110 b 100000 a b 应该产生 110110 然后我想计算 on 位的数量 这应该返回 4 您可以使用内置的将字符串转换为二进制int
  • Mac OS 上的 pybluez 安装错误

    我尝试安装pybluez使用以下命令 pip install pybluez sudo easy install pybluez 但对于这两个命令我最终都会出错 环境 Mac OSX 10 9 1 Python 2 7 点日志 cc fno
  • Scrapy文件下载如何使用自定义文件名

    For my scrapy http doc scrapy org index html我目前正在使用的项目文件管道 https doc scrapy org en latest topics media pipeline html scr
  • 保存 Jupyter Notebook,并显示 Plotly Express 小部件

    我有一个 Jupyter 笔记本 python 我使用plotlyexpress 在笔记本中绘图以进行分析 我想与非编码人员共享此笔记本 并让交互式视觉效果仍然可用 但它似乎不起作用 我尝试以下此处提出的建议 https community
  • 交响二阶颂歌

    我有一个简单的二阶 ODE 的齐次解 当我尝试使用 Sympy 求解初始值时 它返回相同的解 它应该替代 y 0 和 y 0 并产生一个没有常数的解 但事实并非如此 这是建立方程的代码 它是一个弹簧平衡方程 k 弹簧常数 m 质量 我在其他

随机推荐