简体   繁体   English

Matplotlib,Jupyter Notebook:ImportError:没有名为Tkinter的模块

[英]Matplotlib, Jupyter Notebook: ImportError: No module named Tkinter

This question is different from ImportError: No module named 'Tkinter' , read clearfuly before you vote down! 这个问题与ImportError不同:没有名为“ Tkinter”的模块 ,请在投票前阅读clearfuly!

Env: 信封:

  • Python 2.7 Python 2.7
  • CentOS 7 CentOS的7
  • matplotlib 1.5.3 matplotlib 1.5.3
  • notebook 4.1.0 笔记本4.1.0

Installation: 安装:

install it by pip

Show my code 显示我的代码

import gzip, binascii, struct, numpy
import matplotlib.pyplot as plt

with gzip.open(test_data_filename) as f:
    # Print the header fields.
    for field in ['magic number', 'image count', 'rows', 'columns']:
        # struct.unpack reads the binary data provided by f.read.
        # The format string '>i' decodes a big-endian integer, which
        # is the encoding of the data.
        print(field, struct.unpack('>i', f.read(4))[0])

    # Read the first 28x28 set of pixel values. 
    # Each pixel is one byte, [0, 255], a uint8.
    buf = f.read(28 * 28)
    image = numpy.frombuffer(buf, dtype=numpy.uint8)

    # Print the first few values of image.
    print('First 10 pixels:', image[:10])

Show the bug 显示错误

ImportErrorTraceback (most recent call last)
<ipython-input-9-8ba574e10b9a> in <module>()
      3 
      4 import gzip, binascii, struct, numpy
----> 5 import matplotlib.pyplot as plt
      6 
      7 

/usr/lib64/python2.7/site-packages/matplotlib/pyplot.py in <module>()
    112 
    113 from matplotlib.backends import pylab_setup
--> 114 _backend_mod, new_figure_manager, draw_if_interactive, _show = pylab_setup()
    115 
    116 _IP_REGISTERED = None

/usr/lib64/python2.7/site-packages/matplotlib/backends/__init__.pyc in pylab_setup()
     30     # imports. 0 means only perform absolute imports.
     31     backend_mod = __import__(backend_name,
---> 32                              globals(),locals(),[backend_name],0)
     33 
     34     # Things we pull in from all backends

/usr/lib64/python2.7/site-packages/matplotlib/backends/backend_tkagg.py in <module>()
      4 
      5 from matplotlib.externals import six
----> 6 from matplotlib.externals.six.moves import tkinter as Tk
      7 from matplotlib.externals.six.moves import tkinter_filedialog as FileDialog
      8 

/usr/lib64/python2.7/site-packages/matplotlib/externals/six.pyc in load_module(self, fullname)
    197         mod = self.__get_module(fullname)
    198         if isinstance(mod, MovedModule):
--> 199             mod = mod._resolve()
    200         else:
    201             mod.__loader__ = self

/usr/lib64/python2.7/site-packages/matplotlib/externals/six.pyc in _resolve(self)
    111 
    112     def _resolve(self):
--> 113         return _import_module(self.mod)
    114 
    115     def __getattr__(self, attr):

/usr/lib64/python2.7/site-packages/matplotlib/externals/six.pyc in _import_module(name)
     78 def _import_module(name):
     79     """Import module, returning the module after the last dot."""
---> 80     __import__(name)
     81     return sys.modules[name]
     82 

ImportError: No module named Tkinter

TKinter TKinter

Python 2.7.5 (default, Sep 15 2016, 22:37:39) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import Tkinter
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named Tkinter
>>> 

How did this occured 这是怎么发生的

There is a Jupyter Notebook Server running a on a remote CentOS Server, and I access the notebook via my local web-browser, and when I type the above code in the jupyter notebook, the bug occurs!!! 在远程CentOS服务器上有一个运行的Jupyter Notebook服务器 ,我通过本地Web浏览器访问该笔记本,当我在jupyter笔记本中键入上述代码时,就会发生错误!

How can fix this bug? 如何解决此错误? Thank you! 谢谢!

Matplotlib can use several backends , some of them require an GUI toolkit. Matplotlib可以使用多个后端 ,其中一些需要GUI工具箱。 It looks like yor matplotlib install is configured to use the TkAgg backend by default. 看起来您的matplotlib安装已配置为默认使用TkAgg后端。

Usually servers do not have GUI toolkits installed (and it would not make much sense anyway) so matplotlib should be configured to use a non-gui backend. 通常,服务器没有安装GUI工具包(无论如何也没有多大意义),因此应将matplotlib配置为使用非GUI后端。 For example you can specify backend : Agg in the matplotlibrc file (see the link above for details). 例如,您可以在matplotlibrc文件中指定backend : Agg (有关详细信息,请参见上面的链接)。

If you are unable to do this on the server you can create a custom matplotlibrc in the same directory as your notebook. 如果无法在服务器上执行此操作,则可以在与笔记本计算机相同的目录中创建自定义matplotlibrc。 Or just set the backend in your code. 或者只是在代码中设置后端。 In a notebook this should render your plots the same as the TkAgg backend and it does not need Tkinter: 在笔记本中,这应使您的绘图与TkAgg后端相同,并且不需要Tkinter:

import matplotlib as mpl
mpl.use('Agg')
import matplotlib.pyplot as plt

This is a easy but annoyed question. 这是一个简单但烦人的问题。 By default, the Tkinter (or tkinter ) would not be installed in the Linux default Python's package dir. 默认情况下, Tkinter (或tkinter )不会安装在Linux默认的Python软件包dir中。 So, on CentOS, just install the Tkinter 因此,在CentOS上,只需安装Tkinter

yum -y install tkinter

When I try to import Tkinter , import error occurred. 当我尝试import Tkinter ,发生导入错误。 So, I am sure that the Tkinter (or tkinter ) package hadn't be installed. 因此,我确定尚未安装Tkinter (或tkinter )软件包。

Update 更新资料

Here is another question on this and it helps to solve my problem too. 这是另一个问题,它也有助于解决我的问题。

Click python3-importerror-no-module-named-tkinter-on-ubuntu 单击python3-importerror-no-module-named-tkinter-on-ubuntu

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM