引言:在Python3下運(yùn)行Matplotlib之時疮丛,碰到了"No module named _tkinter“的問題,花費(fèi)數(shù)小時進(jìn)行研究解決辆它,這里講整個過程記錄下來誊薄,并嘗試分析過程中的解決思路利弊得失,以資后效锰茉,這里重點(diǎn)提示需要關(guān)注錯誤信息的分析呢蔫,這個是第一現(xiàn)場。
環(huán)境介紹
任何技術(shù)問題的出現(xiàn)以及修復(fù)都是依賴于系統(tǒng)環(huán)境以及特定版本的飒筑,這里首先描述如下:
Ubuntu: 17.10?
Python: 3.6.1? ?基于virutalenv來切換不同的Python環(huán)境
tkinter的問題描述
原程序中基于matplotlib來進(jìn)行繪圖操作咐刨,其中在運(yùn)行過程中,報出來了錯誤信息扬霜。由于原程序大部分無關(guān)問題本身定鸟,且日志本身比較多,這里僅僅截取關(guān)鍵信息:
import _tkinter # If this fails your Python may not be configured for Tk
ImportError: No module named _tkinter
問題初步分析
用過python的朋友都知道著瓶,碰到類似的問題联予,比如import Error,大概率情況下都是某個包未安裝,故第一反應(yīng)就是某個包缺失了沸久,于是首先進(jìn)行了包和類庫的查詢:
pip3 search tkinter
結(jié)果發(fā)現(xiàn)大量的包季眷,被匹配到,其中若干相關(guān)的包有tkinter卷胯,這些信息基本上沒有幫助子刮。
..................
tkinter.help (2.0) - Small Preview of Tkinter Widgets
tkinter3000 (1.1-20051211) - Widget Construction Kit for Tkinter
tkinterhtml (0.7) - Python wrapper for Tkhtml3 (http://tkhtml.tcl.tk/)
tkinterquickhelper (1.5.18) - Helpers for tkinter, extra windows.
tkintertable (1.2) - Extendable table class for Tkinter
.......................
于是嘗試直接安裝tkinter,結(jié)果沒有發(fā)現(xiàn)tkinter包
>> pip3 install tkinter
Collecting tkinter
Could not find a version that satisfies the requirement tkinter (from versions: )
No matching distribution found for tkinter
什么是tkinter窑睁, tcl ,tk
The tkinter package (“Tk interface”) is the standard Python interface to the Tk GUI toolkit. Both Tk and tkinter are available on most Unix platforms, as well as on Windows systems. (Tk itself is not part of Python; it is maintained at ActiveState.) You can check that tkinter is properly installed on your system by running python -m tkinter from the command line; this should open a window demonstrating a simple Tk interface.
上述文件摘自Python社區(qū):https://docs.python.org/3/library/tkinter.html
tkinter其實(shí)是Python調(diào)用tcl程序的標(biāo)準(zhǔn)Python程序挺峡,可以通過這個interface調(diào)用tcl的程序,因?yàn)樵诖蠖鄶?shù)的unix系統(tǒng)中都內(nèi)置了很多的tcl程序和命令担钮。
Tcl 是“工具控制語言(Tool Command Language)”的縮寫橱赠,其面向?qū)ο鬄閛tcl語言。Tk 是 Tcl“圖形工具箱”的擴(kuò)展箫津,它提供各種標(biāo)準(zhǔn)的 GUI 接口項(xiàng)狭姨,以利于迅速進(jìn)行高級應(yīng)用程序開發(fā)。
于是苏遥,執(zhí)行terminal 命令:
python -m tkinter
如果執(zhí)行正確的話饼拍,可以看到如下界面指令,這里主要是指在Linux的桌面系統(tǒng)下:
嘗試解決問題-1
在網(wǎng)絡(luò)上初次搜索之后田炭,發(fā)現(xiàn)有人提示說python-tk/python3-tk的類庫需要在操作系統(tǒng)層面進(jìn)行安裝惕耕。本次案例以Ubuntu為例, 查詢其是否安裝:
>> sudo apt search python3-tk
正在排序... 完成
全文搜索... 完成
python3-tk/artful,now 3.6.3-0ubuntu1 amd64 [已安裝]
Tkinter - Writing Tk applications with Python 3.x
python3-tk-dbg/artful 3.6.3-0ubuntu1 amd64
Tkinter - Writing Tk applications with Python 3.x (debug extension)
python3-tksnack/artful,artful,now 2.2.10.20090623-dfsg-6 all [已安裝]
Sound extension to Tcl/Tk and Python/Tkinter - Python 3.x library
上述是已經(jīng)安裝的顯示信息诫肠,如果沒有安裝司澎,則需要執(zhí)行,安裝指令:
>> sudo apt install python3-tk? (Ubuntu)
>> yum install python3-tk? ? (Centos)
在安裝完成之后栋豫,重新執(zhí)行程序挤安,然后報出同樣的錯誤,問題仍然存在丧鸯。
然后有發(fā)現(xiàn)有信息說蛤铜,需要安裝tk的開發(fā)類庫,于是丛肢,在查詢之后未安裝之后围肥,直接進(jìn)行安裝:
>> sudo apt install tk-dev (Ubuntu/Debian)
>> yum install tk-devel (CentOS)
在安裝之后,重新執(zhí)行程序蜂怎,錯誤仍然存在穆刻。
嘗試解決問題-2
在stackoverflow上搜索一番之后,發(fā)現(xiàn)有人提示說杠步,某些情況下是tcl/tk安裝不完整造成的氢伟,于是就重新下來了tcl/tk的源代碼包:
下載鏈接:?http://www.tcl.tk/software/tcltk/download.html
然后分別下來兩者源代碼榜轿,加壓縮之后,切入源代碼目錄:
>> configure
>> make or make test
>> sudo make install?
在重新安裝tck/tk之后朵锣,重新執(zhí)行代碼谬盐,問題依然存在。
最終解決問題
在嘗試了若干次之后诚些,自我感覺該安裝和設(shè)置的選項(xiàng)都做了飞傀,怎么問題依然存在呢?我忽然發(fā)覺提示錯誤信息中的第一句關(guān)鍵信息:
# If this fails your Python may not be configured for Tk
或許這里的問題诬烹,根本不是tkinter沒有安裝砸烦,或者被正確安裝完成,而是沒有被正確的配置好椅您。目前tcl/tk的內(nèi)容都已經(jīng)安裝好了,只是在python中沒有配置好寡键,但是python3-tk之類的都已經(jīng)安裝了掀泳,但是問題并沒有被解決。如果這樣西轩,那就重新安裝Python運(yùn)行環(huán)境吧员舵。
由于目前的*unix系統(tǒng)都是基于python 2.x系列的,如果需要使用Python3則需要自行進(jìn)行代碼的編譯安裝藕畔,于是重新基于源代碼進(jìn)行了編譯和安裝马僻, 然后進(jìn)入python的命令行,
>> import tkinter
提示可以正確加載注服。于是重新執(zhí)行了之前的原程序韭邓,可以正確輸出結(jié)果了。問題到此為止溶弟,已經(jīng)被正確的解決女淑。
過程總結(jié)分析
這里講其中的得失點(diǎn)進(jìn)行一下總結(jié):
1.? tkinter是一個python的接口類庫,用以調(diào)用tcl/tk程序辜御,故一般在操作系統(tǒng)層面會有相應(yīng)的類庫安裝鸭你,而非僅僅依靠pip3來安裝相應(yīng)的python類庫,比如, python3-tk
2. devel庫的安裝擒权,在*unix系統(tǒng)中袱巨,在進(jìn)行開發(fā)之中,很多情況下是需要devel類庫安裝的碳抄,這個是一個大概率的規(guī)則愉老。
3. 某些情況下,會出現(xiàn)安裝不完整的情況或者安裝缺失某些類庫的情況剖效。這個時候可以考慮重新覆蓋安裝俺夕,比如tcl/tk, python3的重新安裝
4. 重視錯誤信息的分析和方向性指引裳凸。 在本案例中,關(guān)鍵的提示信息有2個部分劝贸,其一姨谷,moulde未安裝或沒有找到,則從安裝類庫的方向進(jìn)行嘗試解決映九。 其二梦湘, 假定包已經(jīng)安裝,但是未被正確的配置好件甥。 筆者在解決問題之時捌议,首選了思路一來進(jìn)行解決;在碰到各種嘗試失敗之后引有,才不得不轉(zhuǎn)向其二的思路來解決瓣颅。如果從兩個方向同時來解決的話,或者這個問題可以被更快的解決譬正。
筆者解決這個問題花費(fèi)了大約3~4個小時左右宫补。