Почему кажется, что tkinter (или turtle) отсутствует или сломан? Разве он не должен быть частью стандартной библиотеки?
Я видел много разных сбоев при попытке использовать пакет стандартной библиотеки Tkinter или связанные с ним функциональные возможности (turtle graphics с использованием turtle
и встроенной IDLE IDE) или со сторонними библиотеками, которые зависят от этого (например, отображение графических окон с помощью Matplotlib).
Кажется, что даже когда нет проблемы, вызванной затенением имен модулей стандартной библиотеки (это обычная проблема для новичков, пытающихся следовать руководству и использовать графику turtle - пример 1; пример 2; пример 3; пример 4), обычно случается, что стандартная библиотека Tkinter просто не работает. Это большая проблема, потому что, опять же, многие новички пытаются следовать руководствам, использующим графику turtle, и слепо предполагают, что turtle
стандартная библиотека будет присутствовать.
Возможно сообщение об ошибке:
Как
ModuleNotFoundError: No module named 'tkinter'
; илиImportError
с тем же сообщением; или с другим корпусом (я знаю, что имя изменилось сTkinter
в 2.x наtkinter
в 3.x; это другая проблема).Аналогично, но ссылается на внутренний
_tkinter
модуль и отображает код с комментарием, который гласит "Если это не удается, ваш Python, возможно, не настроен для Tk"; или с пользовательским сообщением об ошибке, в котором говорится "пожалуйста, установите пакет python-tk" или аналогичный.Как "Нет модуля с именем turtle" при попытке использовать
turtle
конкретно, или одна из вышеперечисленных ошибок.При попытке отобразить график с помощью Matplotlib; обычно это происходит после попытки изменить серверную часть, которая была установлена по умолчанию, чтобы избежать попыток использовать Tkinter.
Почему возникают подобные проблемы, когда Tkinter задокументирован как часть стандартной библиотеки? Как я могу добавить или восстановить отсутствующую функциональность стандартной библиотеки? Есть ли какие-либо особые проблемы для конкретных сред Python?
Смотрите также: "Предупреждение пользователя: Matplotlib в настоящее время использует agg, который не является серверной частью с графическим интерфейсом, поэтому не может отобразить рисунок". при построении графика с помощью pyplot в Pycharm . С 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 может отсутствовать, в зависимости от платформы (хотя, как правило, мотивацией, вероятно, является просто экономия места).
Когда Python устанавливается в Windows с помощью официального установщика, есть возможность включить или исключить поддержку Tcl / Tk.
Установки Python, которые поставляются с Linux предустановленными, могут исключать Tkinter или различные компоненты в соответствии с политикой разработчика дистрибутива. Например, Python, поставляемый с моей копией Linux, включал
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'Other builds might not include the
turtle
module either.Python built from source might be missing Tkinter support because of deliberately chosen configuration options, or because dependencies were missing before starting compilation.
Note that virtual environments will generally have the same Tkinter support as the Python installation they're based upon. However, adding Tkinter support to the base might not update the virtual environment. In this case, it will be necessary to re-create the virtual environment from scratch. It is not possible to add or remove Tkinter support for an individual virtual environment. This is because a virtual environment only differs from its base in terms of the site packages, and there is no site package for Tkinter (since, again, it is a standard library component that cannot be obtained using Pip).
How to add Tkinter support, depending on the environment
See also:
- Guide in the official Tk documentation: https://tkdocs.com/tutorial/install.html
- Some previous (now duplicate) versions of the question with some useful answers:
- Install tkinter for Python
- Tkinter: "Python may not be configured for Tk"
- ImportError: No module named 'Tkinter'
Windows
For Python installed using the official installer from python.org, use the operating system features to choose to "repair" the installation (or, if acceptable, uninstall and reinstall Python). This time, make sure to check the option to install the "tcl/tk and IDLE" optional feature.
Some legacy setups may have had issues with conflicts between 32- and 64-bit versions of Python and Tcl/Tk. This should not cause problems on new setups.
For the embeddable zip package, see Python embeddable zip: install Tkinter .
Linux: Python that came with the Linux distribution
If the Python that came with your Linux distribution doesn't include Tkinter, consider leaving that alone and installing a separate version of Python - just on general principle. However, in general, Tkinter support can be added to the system Python using the system package manager (not Pip).
It will typically be necessary to use sudo
(not included in examples here) to make such changes to the system Python.
On Ubuntu and Debian based systems (including Pop!_OS, Ubuntu-based Mint): use
apt-get install python3-tk
, assuming the system Python is a 3.x version. For 2.x legacy systems, useapt-get install python-tk
instead. In some cases it may be necessary to specify a minor version, likeapt-get install python3.11-tk
. In some cases, a custom exception message may say to installpython-tk
even thoughpython3-tk
should actually be installed instead.For Fedora, use
dnf install python3-tkinter
, as described by d-coder here.For Arch, use
pacman -S tk
, as described by Jabba here.For RHEL, use
yum install python3-tkinter
, as described by amzy-0 here.
Linux: Python built from source
The above packages can only add Tkinter support to the system python (the one installed in /usr/bin
, which is used by the operating system to run essential scripts). They cannot add Tkinter support to a separate Python built from source. This is because, in addition to the actual Tcl/Tk library, using Tkinter in Python requires a per-installation "binding" library (referred to as _tkinter
in the Python source code). System packages will not add this library to other Python installations.
Therefore, install a development Tk package first (e.g. apt-get install tk-dev
) and try rebuilding.
Смотрите также:
Не удается установить tkinter с pyenv Pythons в macOS (используя
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
. Смотрите также: Почему Python, установленный через Homebrew, не включает Tkinter
Среды без головы
Как правило, невозможно установить Tkinter - или любой другой GUI-инструментарий - для безголовых серверных сред, таких как PythonAnywhere или Amazon Linux EC2. Код будет выполняться на удаленном сервере, поэтому нет монитора для отображения графического интерфейса пользователя; хотя в принципе код мог бы отправлять команды обратно клиенту, которые клиент затем мог бы использовать для создания графического интерфейса пользователя, в целом сервер не будет знать о среде клиента. Для выполнения этой работы потребуется предварительная настройка некоторого протокола связи (например, X11).
Виртуальные среды
Во-первых, исправьте установку, на которой основана виртуальная среда. Если это не решит проблему, заново создайте виртуальную среду (и переустановите все, что было установлено в старой виртуальной среде). К сожалению, простого способа обойти это не существует. Проблему можно было бы исправить, изменив кучу символических ссылок, но это не поддерживается.
Если невозможно исправить базовую установку (например, из-за отсутствия sudo
прав в системе), рассмотрите возможность установки отдельного Python (например, путем компиляции из исходного кода), убедитесь, что он установлен с поддержкой Tkinter, и создайте виртуальные среды на основе этого Python.
Компоненты Tkinter
Некоторым пользователям будет полезно точно понять, что содержит система Tkinter. Существует несколько компонентов:
Базовая библиотека Tcl / Tk, написанная на C. Некоторые системы могут независимо иметь установку Tcl / Tk, которая по умолчанию недоступна для Python.
_tkinter
Модуль реализации, который также написан на C и который взаимодействует между Python и Tcl / Tk ("tkinter" означает "интерфейс Tk"). Это деталь реализации, и ее не следует импортировать непосредственно в пользовательский код Python. (код C для этого датируется 1994 годом!)Сам
tkinter
пакет, который предоставляет оболочки для_tkinter
интерфейса более низкого уровня, а такжеttk
(отдельный интерфейс для более новых "тематических" виджетов).Компоненты более высокого уровня, такие как IDLE и
turtle
.
В любой данной установке теоретически может отсутствовать любой или все эти компоненты. При системных установках Python в Linux и macOS сопровождающий дистрибутива отвечает за то, чтобы соответствующий пакет (python3-tk
или аналогичный) устанавливал те части, которые отсутствуют по умолчанию, в соответствующие места.
Как объяснил мне на GitHub Терри Ян Риди: когда установщику Windows будет предложено установить Tcl / Tk, он установит отдельную копию этой библиотеки (и соответствующих _tkinter
и tkinter
т.д.) Для этой установки Python. В Linux Tcl / Tk обычно поставляется вместе с Linux; пакеты, подобные python3-tk
, добавят _tkinter
, который использует системный Tcl / Tk, и tkinter
пакет (который, естественно, найдет и использует _tkinter
реализацию, используя обычный механизм импорта).
Поскольку установка Tcl / Tk, таким образом, "поставляется" для Windows, версия Tcl / Tk будет зависеть от версии Python. В Linux это будет зависеть от системы, и должна быть возможность использовать диспетчер системных пакетов для обновления Tcl / Tk независимо от Python. Обратите особое внимание, что более новые версии Python могут не работать с устаревшим системным Tcl / Tk. (Чтобы проверить версию Tcl / Tk для рабочей установки, см. Как определить, какая версия python3 tkinter установлена на моем компьютере с Linux? .)
Ответ 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, которая соответствует версии pythonvenv
, созданной вами ранее. Например, в 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
Стандартные шаги по устранению неполадок
Пожалуйста, убедитесь в следующем, прежде чем делать вывод, что Tkinter нужно где-то установить.
Имеет ли смысл в первую очередь, пытаться использовать Tkinter в этой программе? В частности, веб-приложения и подобные клиент-серверные приложения обычно не должны пытаться использовать какой-либо набор инструментов для настольного графического интерфейса на сервере, включая Tkinter. Сервер часто не имеет физического дисплея, и конечные пользователи все равно не смогут его увидеть; большинство хостинговых серверов не включают Tkinter и т.д. В свою поддержку Python на так называемых "безголовых" серверах.
Также обычно не имеет смысла пытаться "отправить" графический интерфейс на сторону клиента таким образом. В веб-приложении данные (HTML / CSS / Javascript) будут отправляться в веб-браузер, который создает там пользовательский интерфейс. Для автономных программ, которые будут отправлять данные на сервер, клиент должен реализовать графический интерфейс и использовать свою собственную логику для интерпретации данных, отправленных с сервера, чтобы обновить виджеты графического интерфейса. Серверу нет смысла пытаться "контролировать" приложение на клиенте.
В качестве специального примечания для Matplotlib и подобных библиотек, которые необязательно отображают содержимое GUI: возможно, нет необходимости использовать именно Tkinter для просмотра результатов GUI, и проблему можно решить без GUI. В частности, Matplotlib можно попросить использовать "серверную часть", отличную от GUI, а затем сохранять графики в файлы изображений, а не отображать их на экране (что в любом случае часто более полезно). Также можно сказать, что помимо Tkinter используются другие графические интерфейсы. Подробнее см.:
- "Предупреждение пользователя: Matplotlib в настоящее время использует agg, который не является серверной частью с графическим интерфейсом, поэтому не может отображать рисунок". при построении рисунка с помощью pyplot в Pycharm
- Генерация PNG с помощью matplotlib, когда параметр DISPLAY не определен
- Как изменить серверные части в 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
first , например, от попытки использоватьprint
как оператор в 3.x).Если некоторые установки Python намеренно не поддерживают Tkinter в данной системе, просто убедитесь, что код Tkinter выполняется с установкой, поддерживающей Tkinter.
Особенно помните, что виртуальные среды считаются отдельными установками Python. Как правило, у них будет поддержка Tkinter, если они были созданы из базовой установки, которая имела поддержку Tkinter при создании виртуальной среды. Как правило, невозможно добавить поддержку Tkinter напрямую в виртуальную среду. Имейте в виду, что другие инструменты сторонних производителей - IDE, такие как PyCharm, инструменты цепочки инструментов сборки, такие как Poetry, и инструменты управления средой, такие как
pyenv
- могут создавать виртуальные среды - прочитайте документацию и убедитесь, как они работают.
Ответ 4
Специальные среды
Это вики-ответ сообщества, предназначенный для обобщения ответов о нестандартных установках Python. Пожалуйста, отредактируйте, чтобы добавить к ним информацию. Для начала я включаю некоторые ссылки на предыдущие конкретные вопросы об этих средах, независимо от того, были ли на них даны соответствующие ответы.