TKinter в Virtualenv
Пытается запустить код python с виджетами на основе TKinter из virtualenv.
[email protected]:~/myproject$ env/bin/python Python
2.7.3 (default, Sep 26 2012, 21:51:14) [GCC 4.7.2] on linux2 Type "help", "copyright", "credits" or "license" for more information.
>>> import Tkinter
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 42, in <module>
raise ImportError, str(msg) + ', please install the python-tk package' ImportError: No module named _tkinter, please install the python-tk package
Каков правильный способ установки TK на virtualenv?
Ответы
Ответ 1
Задайте переменную окружения TCL_LIBRARY в activate
script. В Windows (Python 2.7 с Tcl 8.5) просто добавьте эту строку в Scripts\activate.bat
:
set "TCL_LIBRARY=C:\Python27\tcl\tcl8.5"
@Jasper van den Bosch edit: В Ubuntu модификация script activate
заключается в следующем:
TK_LIBRARY=/usr/lib/python2.7/lib-tk:/usr/lib/python2.7/site-packages/PIL:/usr/lib
TKPATH=/usr/lib/python2.7/lib-tk:/usr/lib/python2.7/site-packages/PIL:/usr/lib
TCL_LIBRARY=/usr/lib
export TCL_LIBRARY TK_LIBRARY TKPATH
Ссылка на это можно найти на на этот вопрос по askubuntu
Ответ 2
Я использую python2.7 с virtualenv на машине под управлением linux mint.
Я получил ту же самую ошибку, о которой говорил OP при запуске приложения, которое требовало matplotlib в моем virtualenv. "ImportError: нет модуля с именем _tkinter, установите пакет python-tk"
В итоге я удалил и воссоздал свою виртуальную среду, используя предложения в вышеуказанных сообщениях. Вот мои шаги:
- если ваша виртуальная среда активирована, затем запустите эту команду, чтобы заморозить требования к файлу, к которому вы можете получить доступ позже:
pip freeze > requirements.txt
- Если ваша виртуальная среда активирована, отключите ее, используя:
deactivate
- удалите свою папку virtualenv.
- установить python-tk, используя:
sudo apt-get install python-tk
- воссоздайте свой virtualenv, используя:
virtualenv <nameofyourenv> --system-site-packages
- Далее, активируйте свой virtualenv:
source <virtual environment folder>/bin/activate
- восстановить все ваши пакеты, которые вы ранее застыли из файла requirements.txt:
pip install -r <path to requirements.txt file>
теперь, когда я запускаю тот же код, что и раньше, у него нет проблем с импортом _tkinter. Надеюсь это поможет! Спасибо всем вышеперечисленным предложениям. Это очень помогло мне.
Ответ 3
Мне удается интегрировать tkinter
в python3 в virtualenv с помощью папки symlink tkinter
в virtualenv python3
. Я работаю на меня. Но я не знаю, правильно ли это.
sudo apt-get install python3-tk
cd ~/.virtualenvs/cv/lib/python3.4/
ln -s /usr/lib/python3.4/tkinter tkinter
Надеюсь, это поможет.
В более поздних версиях Python это может привести к ModuleNotFoundError: No module named '_tkinter'
. В этом случае убедитесь, что вы также используете символическую ссылку /usr/lib/python3.x/lib-dynload/_tkinter.cpython-36m-x86_64-linux-gnu.so
как path/to/virtualenv/lib/python3.x/lib-dynload/_tkinter.cpython-36m-x86_64-linux-gnu.so
, используя ln -s /usr/lib/python3.x/lib-dynload/_tkinter.cpython-36m-x86_64-linux-gnu.so _tkinter.cpython-36m-x86_64-linux-gnu.so
из вашего каталога virtualenv lib/python3.x/lib-dynload/
.
Ответ 4
Это действительно обновление отличного ответа от A. Rodas для использования с Python 3.4 и Tcl 8.6 (у меня недостаточно комментариев для комментариев).
Задайте переменную окружения TCL_LIBRARY в вашей активации script. В Windows (Python 3.4 с Tcl 8.6) просто добавьте эту строку в Scripts\activate.bat:
set "TCL_LIBRARY=C:\Python34\tcl\tcl8.6"
Я столкнулся с этой проблемой при использовании Windows 7, Python 3.4 и ggplot в виртуальной среде.
Ответ 5
Чтобы заставить это работать в powershell, вам нужно отредактировать файл activate.ps1 вместо activate.bat. Просто добавьте следующее для активации .ps1:
$env:TCL_LIBRARY = "C:\Python27\tcl\tcl8.5"
Ответ 6
клонировать проект cpython
git clone [email protected]:python/cpython.git
cd
в каталог cpython.
git checkout
желаемая версия вашего виртуального env (для меня это 3.4),
и построить его с помощью
./configure
make
make test
sudo make install
вы найдете файл so _tkinter.cpython-xxx.so
в подкаталоге каталога build/
, скопируйте его в каталог venv lib-dynload
. (для меня это ~/tf1.1py3.4/lib/python3.4/lib-dynload/
)
Ответ 7
Также обновление от ответа A.Rodas - я попытался сделать это в Windows 7 с помощью Windows Powershell, но не смог это сделать (я также не хватает очков репутации для комментариев
Я понял, даже когда я добавил строку
set "TCL_LIBRARY=C:\Python27\tcl\tcl8.5"
и соответствующий для библиотеки tk, activate.bat
script, ссылка tcl не обновлялась, и мне нужно было просто перейти в каталог, где он ищет файлы tcl, и скопировать соответствующий tcl и tk в этот каталог. Теперь файл находится по умолчанию, поэтому вам не нужно обновлять activate.bat
каждый раз, когда вы создаете новую среду
Ответ 8
Для меня решение было скопировать папку tcl из
C:\Users\{myUser}\Python3.5\tcl
к
C:\Users\{myUser}\{myVirtualEnv}
замените {myUser} и {myVirtualEnv} на ваши конкретные имена каталогов.
Ответ 9
В случае, если это помогает тем, кто царапает голову после прочтения всех ответов здесь - также может показаться, что вам может потребоваться заново создать virtualenv, если вы создали его до установки python3.6-tk
. Похоже, ни одно из решений с указанием TK_PATH
и TCL_PATH
не сработало даже при использовании путей, указанных tkinter вне виртуальной среды (см. этот пост). Чтобы быть уверенным, просто удалите venv и создайте новый.