在windows下的虛擬環境中使用tk,要留神了

事情是這樣的:有朋友在學習用matplotlib做圖,遇到一些問題問我,我也沒用過,就想先裝一個試試。而後呢,我就隨手建立了個虛擬環境。結果,涉及到matplotlib的第一行就報錯了:python

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確實是裝了的:windows

 

但是路徑不對。經羣裏的同窗指導,我還特地在主環境下測試了一下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

 

但是虛擬環境中就不正常了。spa

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.

 

這可就尷尬了。code

可是,我又注意到一個細節:Tcl在查找環境的時候,會查找本機的主python環境,好比剛纔那段報錯中,Tcl查找了這樣兩個環境:blog

C:/Python35/lib/tcl8.6
D:/workspace/PyTest/py3env/lib/tcl8.6

 

其中C盤是個人主環境,D:/workspace/PyTest/py3env是虛擬環境。get

而後我開始翻代碼,看tcl查詢的路徑是啥。找不到。網上介紹了添加環境變量,TCL_LIBRARY和TK_LIBRARY,我試了也不行(可能這兩個變量僅限於Linux系統),在path裏面添加也不行。string

走投無路的狀況下我開始動歪腦筋,把Tcl8.6整個文件夾從C:\Python35\tcl\複製到了C:\Python35\Lib中,而後,竟然……it

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的搜索路徑中。至於這叫什麼操做,我也不知道。

相關文章
相關標籤/搜索