如题,本文旨在解决python报错问题:ModuleNotFoundError: No module named '_tkinter'
;换言之,本文记录在Ubuntu系统上如何给python的不同版本(包含python2和python3)安装tkinter模块。
操作系统:
已有的python版本:
Python编辑器:
为什么要用到tkinter模块?
答: 因为在Ubuntu下VSCode中写python代码的时候,如果用到matplotlib模块作图,会无法显示图片弹窗(即plt.show()
没用),只能委曲求全选择plt.savefig(path, 'plot.png')
存到本地来看。
可能的原因是没有安装tkinter模块。
我不想委曲求全,于是开始寻求解决方案。
我在VS code里面写了这样的代码,并在python3.6下运行:
import matplotlib
matplotlib.use('TkAgg') # vscode
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-3, 3, 50)
y1 = 2*x + 1
plt.plot(x, y1)
plt.show()
然而,报错如下:
ModuleNotFoundError: No module named ‘_tkinter’
原因:python3.6没有tkinter模块。
以下为解决方案。(虽然是用的python3,但顺手给python2.7也装了tkinter)
这个较为简单,参考 [1] 即可:
1)安装tkinter:
在终端运行:
sudo apt-get update
sudo apt-get install python-tk
2)验证是否安装tkinter模块:
在VScode下写如下代码并运行:
import Tkinter # 注意,Python2下面的Tkinter首字母要大写的
Tkinter._test()
注意:这里失败了,但是整个过程是我在这上面耗时最久的地方,所以我认为有必要记录一下。(这章节里面的指令都是可以运行的,我都试过,目测不会造成什么问题。如果怕出问题或者想直接找到解决方案的话,可以直接跳到第5节:可行方案。)
1)先参考[1],利用apt-get指令安装适用于python3的tkinter
:
在终端输入:
sudo apt-get update
sudo apt-get install python3-tk
2)验证是否对python3.6.3有效
:
在VScode中写如下代码并运行:
import tkinter # 注意: python3版本下import tkinter的时候,tkinter首字母小写
tkinter._test()
然而,依旧报错:
ModuleNotFoundError: No module named ‘_tkinter’
3)查看python3-tk的版本
:
此时在终端输入dpkg --list | grep python3-tk
查看一下python3-tk的版本,输出信息如下:
apr@apr:~$ dpkg --list | grep python3-tk
ii python3-tk 3.4.3-1~14.04.2 amd64 Tkinter - Writing Tk applications with Python 3.x
说明这时候安装的python3-tk是面向python3.4版本的
。可惜可惜。
4)切换到python3.4
:
此时在VSCode下切换到python3.4版本,运行同样的python代码:
import tkinter
tkinter._test()
果然可以正常运行且有预期的弹窗出现。
5)总结
:
由于我python3.6.3 是从源文件夹安装的,其可执行的python路径在/usr/local/bin/python3
, 系统自带的python2和3都是在/usr/bin/
文件夹下。而且可能系统自带的python3.4优先级比3.6高,所以python3-tk直接就针对python3.4了。但我认为最可能的原因是:Ubuntu14.04的apt源中只有针对python3.4的python3-tk安装包。(Sadly)
6)一系列尝试:
(虽然失败,也记录下其中曲折)
./configure
sudo make clean
sudo make
sudo make test
sudo make install
么得用呢。
/usr/bin/python3
从指向python3.4改为指向python3.6.3,利用的是:sudo update-alternatives --install xxx
和sudo update-alternatives --config python3
指令。Installing Tk on Linux
,并尝试下载:https://platform.activestate.com/dalewushuang/ActiveTcl-8.5/distributions?platformID=eef02e93-f4a9-5cca-a131-a388ecf57442 下面的ActiveTcl-8.5.19.8519-x86_64-linux-glibc-2.5-403583.tar.gz
,然而:网速太慢,太难下载,而且好像还有很多其他各种步骤,而且还要重新编译python3.6.3的源码。这可也太麻烦了。python3.4 -m pip install seaborn
等等指令(提示需要python3.5及以上版本)。那就太不方便了,所以我放弃了回退版本。sudo add-apt-repository ppa:deadsnakes/ppa #添加一个个人仓库,里面有适合python3.6版本的tkinter模块
sudo apt-get update
sudo apt-get install python3.6-tk
然而,我发现VScode中多了一个Python版本:
所以,这个python3.6-tk只支持python3.6.8,不支持python3.6.3,太难了。
然后我想,要不直接用python3.6.8版本就好啦。但是:1)我没找到卸载python3.6.3的方法(貌似可以用locate python3.6 | xargs rm -rf
,大概是这样的指令,但是我怕无法恢复,所以不敢用);2)python3.6.8呢,又是minimal版本的好像,我也没找到他的dist-packages文件夹,也没找到他的pip3,反正就是各种没找到,好像也install不了模块,所以也用不了。
很尴尬。
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt-get update
sudo apt-get install python3.6
失败了,提示已经有python3.6了。
以上皆为失败尝试。目前来看,是没办法给python3.6.3安装tkinter模块了。但是我最后找到了一个解决方案,请看以下章节。
部分可参考[3]。
1)安装python3.5
:
sudo add-apt-repository ppa:deadsnakes
sudo apt-get update
sudo apt-get install python3.5
2)安装适用于python3.5版本的tkinter模块
:
sudo add-apt-repository ppa:deadsnakes/ppa #添加一个个人仓库,里面有适合python3.6版本的tkinter模块
sudo apt-get update
sudo apt-get install python3.5-tk
3)验证tkinter是否安装成功:
import tkinter
tkinter._test()
弹窗已出,成功啦。
4)用pip安装其他的作图相关模块,比如seaborn:
python3.5 -m pip install --user seaborn
备注:
python3.5安装好之后好像还要安装pip。(我也记不得了,应该问题不大),这里如果要装的话,在终端运行:
wget https://bootstrap.pypa.io/get-pip.py
python3.5 get-pip.py # 注意:这个py文件好像只支持python3.5及以上的版本。所以python3.4确实比较老了。
参考:How to install pip with Python 3?
没啥好说的,光是这篇博客都花了1个小时。整个过程,至少3+小时。
由于整个下午都在和这个问题“杠着”,一直到5点都没找到解决方案,但是在这个过程中也在不断熟悉ubuntu下面的python的各种相关操作,所以一直到5点多准备溜了之前,终于给找到了一个可行方案,也是很不容易了。故而有一个感悟:
无数的经验、经历告诉我,只要坚持下去,一定能在有限的时间内找到解决方案(或者可替代的方案)
所以还是得继续努力,要敢于钻研。