在windows下的虚拟环境中使用tk,要留神了
事情是这样的:有朋友在学习用matplotlib作图,遇到一些问题问我,我也没用过,就想先装一个试试。然后呢,我就随手创建了个虚拟环境。结果,涉及到matplotlib的第一行就报错了:
Traceback (most recent call last):
File "D:/workspace/PyTest/get_data.py", line 22, in <module>
plt.scatter(X[:50, 0], X[:50, 1], color="red", marker="o", label="setosa")
File "D:\workspace\PyTest\py3env\lib\site-packages\matplotlib\pyplot.py", line 3420, in scatter
ax = gca()
File "D:\workspace\PyTest\py3env\lib\site-packages\matplotlib\pyplot.py", line 950, in gca
return gcf().gca(**kwargs)
File "D:\workspace\PyTest\py3env\lib\site-packages\matplotlib\pyplot.py", line 586, in gcf
return figure()
File "D:\workspace\PyTest\py3env\lib\site-packages\matplotlib\pyplot.py", line 535, in figure
**kwargs)
File "D:\workspace\PyTest\py3env\lib\site-packages\matplotlib\backends\backend_tkagg.py", line 81, in new_figure_manager
return new_figure_manager_given_figure(num, figure)
File "D:\workspace\PyTest\py3env\lib\site-packages\matplotlib\backends\backend_tkagg.py", line 89, in new_figure_manager_given_figure
window = Tk.Tk()
File "C:\Python35\Lib\tkinter\__init__.py", line 1868, in __init__
self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: Can't find a usable init.tcl in the following directories:
C:/Python35/lib/tcl8.6 D:/workspace/PyTest/py3env/lib/tcl8.6 D:/workspace/PyTest/lib/tcl8.6 D:/workspace/PyTest/py3env/library D:/workspace/PyTest/library D:/workspace/PyTest/tcl8.6.4/library D:/workspace/tcl8.6.4/library This probably means that Tcl wasn't installed properly.
经过分析,我想这是因为没有找到tkinter,而matplotlib需要用到这个。可是这东西装python时候是默认的,我肯定会装的。我翻了翻我的电脑,Tcl确实是装了的:

可是路径不对。经群里的同学指导,我还特意在主环境下测试了一下tk和tcl环境:
import tkinter
root = tkinter.Tk()
print(root.tk.exprstring('$tcl_library'))
print(root.tk.exprstring('$tk_library'))
在主环境中结果也是正常的:
C:\Python35\tcl\tcl8.6
C:/Python35/tcl/tk8.6
可是虚拟环境中就不正常了。
Traceback (most recent call last):
File "D:/workspace/PyTest/testtk.py", line 2, in <module>
root = tkinter.Tk()
File "C:\Python35\Lib\tkinter\__init__.py", line 1868, in __init__
self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: Can't find a usable init.tcl in the following directories:
C:/Python35/lib/tcl8.6 D:/workspace/PyTest/py3env/lib/tcl8.6 D:/workspace/PyTest/lib/tcl8.6 D:/workspace/PyTest/py3env/library D:/workspace/PyTest/library D:/workspace/PyTest/tcl8.6.4/library D:/workspace/tcl8.6.4/library This probably means that Tcl wasn't installed properly.
这可就尴尬了。
但是,我又注意到一个细节:Tcl在查找环境的时候,会查找本机的主python环境,比如刚才那段报错中,Tcl查找了这样两个环境:
C:/Python35/lib/tcl8.6
D:/workspace/PyTest/py3env/lib/tcl8.6
其中C盘是我的主环境,D:/workspace/PyTest/py3env是虚拟环境。
然后我开始翻代码,看tcl查询的路径是啥。找不到。网上介绍了添加环境变量,TCL_LIBRARY和TK_LIBRARY,我试了也不行(可能这两个变量仅限于Linux系统),在path里面添加也不行。
走投无路的情况下我开始动歪脑筋,把Tcl8.6整个文件夹从C:\Python35\tcl\复制到了C:\Python35\Lib中,然后,居然……
Traceback (most recent call last):
File "D:/workspace/PyTest/ML/mcpperceptron/get_data.py", line 22, in <module>
plt.scatter(X[:50, 0], X[:50, 1], color="red", marker="o", label="setosa")
File "D:\workspace\PyTest\py3env\lib\site-packages\matplotlib\pyplot.py", line 3420, in scatter
ax = gca()
File "D:\workspace\PyTest\py3env\lib\site-packages\matplotlib\pyplot.py", line 950, in gca
return gcf().gca(**kwargs)
File "D:\workspace\PyTest\py3env\lib\site-packages\matplotlib\pyplot.py", line 586, in gcf
return figure()
File "D:\workspace\PyTest\py3env\lib\site-packages\matplotlib\pyplot.py", line 535, in figure
**kwargs)
File "D:\workspace\PyTest\py3env\lib\site-packages\matplotlib\backends\backend_tkagg.py", line 81, in new_figure_manager
return new_figure_manager_given_figure(num, figure)
File "D:\workspace\PyTest\py3env\lib\site-packages\matplotlib\backends\backend_tkagg.py", line 89, in new_figure_manager_given_figure
window = Tk.Tk()
File "C:\Python35\Lib\tkinter\__init__.py", line 1868, in __init__
self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: Can't find a usable tk.tcl in the following directories:
C:/Python35/lib/tcl8.6/tk8.6 C:/Python35/lib/tk8.6 D:/workspace/PyTest/py3env/lib/tk8.6 D:/workspace/PyTest/lib/tk8.6 D:/workspace/PyTest/py3env/library This probably means that tk wasn't installed properly.
报的错从“找不到Tcl”变成了“找不到Tk”!
难道说成功了?于是,我又如法炮制,把tk8.6文件夹从C:\Python35\tcl\复制到了C:\Python35\Lib\tcl8.6中。
然后就真的成功了!

这叫什么鬼问题嘛!╭(╯^╰)╮
好吧,就是提醒注意一下,在windows中的虚拟环境下,如果使用tk,注意tcl和tk的路径。可以把整个目录复制到tcl和tk的搜索路径中。至于这叫什么操作,我也不知道。
在windows下的虚拟环境中使用tk,要留神了的更多相关文章
- Windows下Git Bash中VIM打开文件中文乱码
Windows下Git Bash中VIM打开文件中文乱码,解决方法是: 步骤一 admin@DESKTOP-O99620V MINGW64 /d/项目GGE/Hard_for_GGE (master) ...
- python 在windows下的 虚拟环境
解决 python 环境问题 windows 下安装 pip install virtualenv virtualenv的基本使用 1.1 创建虚拟环境 virtualenv venv 为环境指定Py ...
- 【转】Windows下使用libsvm中的grid.py和easy.py进行参数调优
libsvm中有进行参数调优的工具grid.py和easy.py可以使用,这些工具可以帮助我们选择更好的参数,减少自己参数选优带来的烦扰. 所需工具:libsvm.gnuplot 本机环境:Windo ...
- 在 Linux/windows下 命令行中使用和执行 PHP 代码[交互式php]
[注释]在ubuntu下,升级php到7.1版本,虽然提示的是Interactive mode enabled, 但实际上可以直接书写命令,和interactive shell效果一样. 一:wind ...
- vmware player 在windows下nat模式中的端口映射
1.设置虚拟机nat共享的网卡为固定ip vmware虚拟机使用nat网络时,是VMware Network Adapter VMnet8网卡提供的nat服务.查看VMware Network Ada ...
- windows下在yii中使用mongodb
1.编译或下载对应dll动态链接库拓展文件,下载地址:点我,不知道如何编译windows下的dll拓展->点我 2.找到web服务器软件,如apache,nginx等webserver处理浏览器 ...
- python第二篇:windows 下virtualenvwrapper虚拟环境搭建
优点 安装过程 第一步:安装virtualenv pip install virtualenv 第二步:新建virtualenv virtualenv testvir 第三步:运行虚拟环境相关命令 进 ...
- Windows 环境下于虚拟环境中源码安装 cx_oracle
安装前提条件: (1).安装 instantclient-basic-nt (2).安装 instantclient-sdk-nt (3).安装 Microsoft Visual C++ Compil ...
- windows下python虚拟环境virtualenv安装和使用
前面介绍了python在ubuntu16.04环境下,python的虚拟环境virtualenv的安装,下面介绍在windows环境下的安装和使用. 环境信息 操作系统:windows10 pytho ...
随机推荐
- 写给创业者:如何打造让用户离不开的App
百度权重查询 词库网 网站监控 服务器监控 SEO监控 Swift编程语言教程 还记得那个学会编程,开发了一个拼车应用程序——Trees For Cars,并因此发了一笔小财的流浪汉吗?今天的新闻称, ...
- [Linux] Linux系统(登陆、退出、修密码)
登录linux系统,就是输入用户名,密码,回车就可以了 修改密码 使用命令passwd,输入新密码和确认密码,密码的规则要求较严,多试几次 使用命令whoami,查看当前用户信息 使用命令users或 ...
- Java利用反射取得类的所有信息
Java中可以利用反射获取类的名称.构造函数.属性.方法.也就是说可以通过反射可以取得类的所有信息(不管该成员是否封装为private). 如有下面的Dept类定义: package org.lyk. ...
- 阿里云Maven仓库
<mirror> <id>nexus-aliyun</id> <mirrorOf>*</mirrorOf> <name>Nexu ...
- 【转】Java线程详解
Java线程:概念与原理 一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程 ...
- 如果你的shiro没学明白,那么应该看看这篇文章,将shiro整合进springboot
最近在做项目的时候需要用到shiro做认证和授权来管理资源 在网上看了很多文章,发现大多数都是把官方文档的简介摘抄一段,然后就开始贴代码,告诉你怎么怎么做,怎么怎么做 相信很多小伙伴即使是跟着那些示例 ...
- LDA和PCA区别
https://blog.csdn.net/brucewong0516/article/details/78684005
- Leetcode 计划
如何正确高效地使用LeetCode? LeetCode按照怎样的顺序来刷题比较好? LeetCode 题目总结/分类 Leetcode 简略题解 - 共567题 500. Keyboard Row [ ...
- IDEA 中将已有项目放到 GitHub 上去
前言:公司用的都是 idea+svn 来管理代码,所以家里尝试一下 idea+github 来管理.我的本地仓库是配置过ssh key,所以此处没有再次配置ssh key,如需配置可以参考 https ...
- JVM的逃逸分析
我们都知道Java中的对象默认都是分配到堆上,在调用栈中,只保存了对象的指针.当对象不再使用后,需要依靠GC来遍历引用树并回收内存.如果堆中对象数量太多,回收对象还有整理内存,都会会带来时间上的消耗, ...