Virtualenv中的TKinter

38
尝试从虚拟环境中运行带有基于TKinter的小部件的Python代码。
    user@computer:~/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?


2
我对TKinter并不了解,但我曾经遇到过类似的问题,尝试在virtualenv中运行wxPythonpyGTK。由于它们严重依赖共享库,我从未能找到令人满意的安装方法。除非你需要系统站点包之外的某个特定版本的Tkinter,否则我建议只需创建一个带有--system-site-packages标志的virtualenv,然后本地安装您需要的任何其他特定模块即可。 - ali_m
@Jasper van den Bosch,由于您的编辑被拒绝(审核人员认为它无效,但实际上非常有用),我已将其添加到我的答案中,随意改进。 - A. Rodas
9个回答

48

activate脚本中设置环境变量TCL_LIBRARY。对于Windows平台上运行Python 2.7且使用Tcl 8.5,则只需将以下一行添加到Scripts\activate.bat文件中:

set "TCL_LIBRARY=C:\Python27\tcl\tcl8.5"

@Jasper van den Bosch编辑:在Ubuntu上,对脚本 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上的这个问题中找到。


5
为了使用方便,我建议使用 --system-site-packages 参数初始化 virtualenv - luka5z
5
你想在Python 3中如何完成这个任务? - Adrian Keister
使用相同的Python版本(没有升级或更改),创建一个新的虚拟环境对我来说是有效的。 - Sathyamoorthy R

22

我成功地将tkinter与python3集成到virtualenv中,通过将symlink tkinter文件夹链接到virtualenv python3。这个方法对我有效,但我不确定是否为正确方法。

  1. 安装tkinter
sudo apt-get install python3-tk

前往您的虚拟环境Python库文件夹。
cd ~/.virtualenvs/cv/lib/python3.4/
  1. 链接tkinter
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

在你的虚拟环境中,从lib/python3.x/lib-dynload/目录中执行。


3
如果您打算使用sudo安装virtualenv,那么我认为使用virtualenv就没有意义了。 - JasTonAChair
2
sudo 是为了安装二进制库 Tk。virtualenv 只需要一个符号链接就知道在哪里查找了。 - Ari Gesher
除了安装“tkinter”之外,我还需要在Python 3.5上创建符号链接“ln -s /usr/lib/python3.5/lib-dynload/_tkinter.cpython-35m-x86_64-linux-gnu.so _tkinter.cpython-35m-x86_64-linux-gnu.so”,以使其正常工作。 - Talespin_Kit
在 Ubuntu 18.04 上使用 pyenv 虚拟环境时,我不得不将符号链接放在已安装的基本 python 中,而不是在虚拟版本目录中。例如:cd ~/.pyenv/versions/3.7.3/lib/python3.7/ 然后 ln -s /usr/lib/python3.7/tkinter tkinter 和 cd ln -s /usr/lib/python3.7/lib-dynload/_tkinter.cpython-37m-x86_64-linux-gnu.so lib-dynload/_tkinter.cpython-37m-x86_64-linux-gnu.so。 - Chris Hanning
它在Python 3.10(在Linux Mint 21上)再次出现故障,并且这次在任何部分名称中都没有包含“dynload”一词的目录。如果我在终端中运行虚拟机并运行源代码命令,一切正常,但是如果我使用Visual Studio运行程序,使用虚拟机的python可执行文件,则会看到相同的源代码命令运行,但不起作用("ModuleNotFoundError: No module named 'tkinter'")。太奇怪了... - Poikilos

10
我正在一台运行Linux Mint的机器上使用Python2.7和一个虚拟环境。当在我的虚拟环境中运行需要Matplotlib的应用程序时,我收到了与OP提到的完全相同的错误信息:“ImportError: No module named _tkinter, please install the python-tk package”。
最终我按照上面的帖子建议删除并重新创建了我的虚拟环境。以下是我的步骤:
  1. 如果您的虚拟环境已激活,请运行此命令将要求冻结为一个文件,以便稍后访问: pip freeze > requirements.txt
  2. 如果您的虚拟环境已激活,请使用以下命令取消激活: deactivate
  3. 删除您的虚拟环境文件夹。
  4. 使用以下命令安装python-tk: sudo apt-get install python-tk
  5. 使用以下命令重新创建您的虚拟环境: virtualenv <nameofyourenv> --system-site-packages
  6. 接下来,激活您的虚拟环境: source <virtual environment folder>/bin/activate
  7. 从requirements.txt文件中恢复您之前冻结的所有软件包: pip install -r <path to requirements.txt file>
现在,当我运行与之前相同的代码时,它导入_tkinter没有任何问题。希望这能帮到你!感谢以上所有人的建议。它确实帮助了我很多。

6

这是对A.Rodas伟大回答的更新,适用于Python 3.4和Tcl 8.6 (我没有足够的声望来评论)。

在您的激活脚本中设置环境变量TCL_LIBRARY。对于Windows系统(Python 3.4与Tcl 8.6),只需将此行添加到Scripts\activate.bat中:

set "TCL_LIBRARY=C:\Python34\tcl\tcl8.6"

我在虚拟环境中使用Windows 7操作系统、Python 3.4和ggplot时遇到了这个问题。


这个解决方案对我很有用。除了我不得不找出Python在我的Windows机器上安装在哪里。 - Omar Tariq

1
要在PowerShell中使其工作,您需要编辑activate.ps1文件而不是activate.bat文件。只需将以下内容添加到activate.ps1中即可: $env:TCL_LIBRARY = "C:\Python27\tcl\tcl8.5"

1
克隆CPython项目。
git clone git@github.com:python/cpython.git

cd 到 cpython 目录。 git checkout 你所需的虚拟环境版本(对我来说是3.4), 并使用以下命令进行构建。

./configure
make
make test
sudo make install

build/目录的子目录中,您将找到一个名为_tkinter.cpython-xxx.so的so文件,请将其复制到venv的lib-dynload目录中(对于我来说,它是~/tf1.1py3.4/lib/python3.4/lib-dynload/)。

这还需要安装Tk库(即sudo apt install tk-dev),并确保检出与您的venv中使用的Python版本相对应的版本(即git checkout tags/v3.6.8 -b v3.6.8)。 - ryanjdillon
忘了提到,我的问题是我自己编译了Python,并且当时没有安装Tk库。安装这些并重新编译/安装后,问题得到解决,因为我的venv仍然引用相同的安装位置。 - ryanjdillon

0

如果您在阅读了所有答案后仍然感到困惑,这可能会有所帮助 - 似乎您需要在安装python3.6-tk之前重新创建虚拟环境。即使使用tkinter在虚拟环境外部给出的路径(请参见this post),指定TK_PATHTCL_PATH的解决方案也似乎无效。为确保正确,请删除venv并创建一个新的。


0

另外,A.Rodas 的回答有一个更新 - 我尝试在Windows 7中使用Windows Powershell进行操作,但无法完成(我也没有足够的声望点来评论)

我意识到即使我添加了以下行 set "TCL_LIBRARY=C:\Python27\tcl\tcl8.5" 以及对于tk库的相应行到activate.bat脚本中,tcl链接仍未得到更新,我需要做的就是进入它正在查找tcl文件的目录,并将相应的tcl和tk文件复制到该目录。现在文件位于默认位置,因此您无需每次创建新环境时更新activate.bat


我有完全相同的问题,修改脚本无效,使用pew进行虚拟环境管理时环境变量未设置。尝试@user2623839的修复方法也不起作用,TCL_LIBRARY未设置。你碰巧也在使用pew吗? - Overdrivr

0

对我来说,解决方案是从中复制文件夹tcl

C:\Users\{myUser}\Python3.5\tcl

C:\Users\{myUser}\{myVirtualEnv}

请将 {myUser} 和 {myVirtualEnv} 替换为您的特定目录名称。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接