Problem z brakiem Tkinter/Turtle/IDLE po instalacji Pythona z użyciem Pyenv
pyenv pozwala na instalację różnych wersji Pythona.
Ściąga on kod źródłowy i kompiluje go.
Do kompilacji niektórych modułów może jednak wymagać doinstalowania dodatkowych bibliotek - zwłaszcza takich zawierających -dev
w nazwie.
Takich dodatkowych bibliotek wymaga moduł tkitner
(a także sqlite3
i kilka innych ale to tutaj pominę).
pydev
podczas instalacji nie informuje, że kompiluje bez obsługi tkinter
choć (jak w poniższym przykładzie) informuje, że pomija kompilację innych sqlite3
z powodu braku wymaganych bibliotek.
$ pyenv install 3.7.2
Downloading Python-3.7.2.tar.xz...
-> https://www.python.org/ftp/python/3.7.2/Python-3.7.2.tar.xz
Installing Python-3.7.2...
WARNING: The Python sqlite3 extension was not compiled. Missing the SQLite3 lib?
Installed Python-3.7.2 to /home/furas/.pyenv/versions/3.7.2
Dopiero podczas importu tkinter
wychodzi na jaw, że brak jest biblioteki _tkinter
.
$ .pyenv/versions/3.7.2/bin/python
Python 3.7.2 (default, Feb 18 2019, 01:28:12)
[GCC 7.3.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>
File "/home/furas/.pyenv/versions/3.7.2/lib/python3.7/tkinter/__init__.py", line 36, in <module>
import _tkinter # If this fails your Python may not be configured for Tk
ModuleNotFoundError: No module named '_tkinter'
To samo można zobaczyć przy użyciu -m tkinter
.
$ .pyenv/versions/3.7.2/bin/python -m tkinter
Traceback (most recent call last):
File "/home/furas/.pyenv/versions/3.7.2/lib/python3.7/runpy.py", line 183, in _run_module_as_main
mod_name, mod_spec, code = _get_module_details(mod_name, _Error)
File "/home/furas/.pyenv/versions/3.7.2/lib/python3.7/runpy.py", line 142, in _get_module_details
return _get_module_details(pkg_main_name, error)
File "/home/furas/.pyenv/versions/3.7.2/lib/python3.7/runpy.py", line 109, in _get_module_details
__import__(pkg_name)
File "/home/furas/.pyenv/versions/3.7.2/lib/python3.7/tkinter/__init__.py", line 36, in <module>
import _tkinter # If this fails your Python may not be configured for Tk
ModuleNotFoundError: No module named '_tkinter'
Ten sam problem jest z turtle
i turtledemo
, które zbudowane są w oparciu o tkinter
.
$ .pyenv/versions/3.7.2/bin/python -m turtle
Traceback (most recent call last):
File "/home/furas/.pyenv/versions/3.7.2/lib/python3.7/runpy.py", line 193, in _run_module_as_main
"__main__", mod_spec)
File "/home/furas/.pyenv/versions/3.7.2/lib/python3.7/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/home/furas/.pyenv/versions/3.7.2/lib/python3.7/turtle.py", line 107, in <module>
import tkinter as TK
File "/home/furas/.pyenv/versions/3.7.2/lib/python3.7/tkinter/__init__.py", line 36, in <module>
import _tkinter # If this fails your Python may not be configured for Tk
ModuleNotFoundError: No module named '_tkinter'
$ .pyenv/versions/3.7.2/bin/python -m turtledemo
Traceback (most recent call last):
File "/home/furas/.pyenv/versions/3.7.2/lib/python3.7/runpy.py", line 193, in _run_module_as_main
"__main__", mod_spec)
File "/home/furas/.pyenv/versions/3.7.2/lib/python3.7/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/home/furas/.pyenv/versions/3.7.2/lib/python3.7/turtledemo/__main__.py", line 91, in <module>
from tkinter import *
File "/home/furas/.pyenv/versions/3.7.2/lib/python3.7/tkinter/__init__.py", line 36, in <module>
import _tkinter # If this fails your Python may not be configured for Tk
ModuleNotFoundError: No module named '_tkinter'
To samo może być przy uruchamianiu idle
, które także zbudowane jest w oparciu o tkinter
.
$ .pyenv/versions/3.7.2/bin/idle
** IDLE can't import Tkinter.
Your Python may not be configured for Tk. **
tkinter
do samego działania wymaga tcl
, tk
, a do kompilacji jeszcze tcl-dev
, tk-dev
.
Wystarczyć jednak doinstalować samo tk-dev
a pozostałe biblioteki zostaną automatycznie też zainstalowane.
$ apt install tk-dev
Mając potrzebne biblioteki należy usunąć Pythona i ponownie go zainstalować.
$ pyenv uninstall 3.7.2
$ pyenv install 3.7.2
Ten sam problem może być przy samodzielnym kompilowaniu kodu źródłowego
ale kompilacja może podawać więcej informacji o brakujących biblitekach
i można łatwiej zauważyć, że tkinter
nie został skompilowany.
Uwaga: lista wersji Pythona możliwych do instalacji za pomoca pyenv
$ pyenv install --list
Buy a Coffee