GoingMyWay
GoingMyWay

Reputation: 17468

Matplotlib, Jupyter Notebook: ImportError: No module named Tkinter

This question is different from ImportError: No module named 'Tkinter', read clearfuly before you vote down!

Env:

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

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!!!

How can fix this bug? Thank you!

Upvotes: 0

Views: 2192

Answers (2)

GoingMyWay
GoingMyWay

Reputation: 17468

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. So, on CentOS, just install the Tkinter

yum -y install tkinter

When I try toimport Tkinter, import error occurred. So, I am sure that the Tkinter(or tkinter) package hadn't be installed.

Update

Here is another question on this and it helps to solve my problem too.

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

Upvotes: -1

Stop harming Monica
Stop harming Monica

Reputation: 12590

Matplotlib can use several backends, some of them require an GUI toolkit. It looks like yor matplotlib install is configured to use the TkAgg backend by default.

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. For example you can specify backend : Agg in the matplotlibrc file (see the link above for details).

If you are unable to do this on the server you can create a custom matplotlibrc in the same directory as your notebook. 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:

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

Upvotes: 4

Related Questions