Hi,
I just ran into the following Bug: When choosing Qt4Agg as my backend in the matplotlibrc, using TeX will break matplotlib. When choosing backend: MacOSX, everything works fine. The QT4Agg backend also works fine as long as I'm not using TeX. Here is a fairly minimal example:
######### file: killqtmpl.py #########
import pylab as plt
import time
print "This works"
plt.rcdefaults()
plt.plot([1,2,3])
plt.show()
time.sleep(2)
plt.close()
print "This won't work with qt4agg"
plt.rc('font', family='sans-serif')
plt.rc('text', usetex=True)
plt.rcParams['text.latex.preamble']=r""" \usepackage[tx]{sfmath}
\usepackage{helvet}
"""
plt.plot([1,2,3])
plt.show()
time.sleep(2)
plt.close()
print "This won't either"
plt.rc('font', family='serif')
plt.rcParams['text.latex.preamble']=r"\usepackage{mathptmx}"
plt.plot([1,2,3])
plt.show()
#############################
So, when i run the above script using the MacOSX backend, it displays the same figure (a blue line) three times and outputs:
-------
This works
This won't work with qt4agg
This won't either
-------
Now when using Qt4Agg, only the first figure will get displayed and the following error messages appear:
-------
In [1]: run killqtmpl.py
This works
This won't work with qt4agg
ERROR: An unexpected error occurred while tokenizing input
The following traceback may be corrupted or invalid
The error message is: ('EOF in multi-line statement', (17, 0))
ERROR: An unexpected error occurred while tokenizing input
The following traceback may be corrupted or invalid
The error message is: ('EOF in multi-line statement', (15, 0))
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/backends/backend_qt4agg.pyc in paintEvent(self, e)
80
81 if self.replot:
---> 82 FigureCanvasAgg.draw(self)
83 self.replot = False
84
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/backends/backend_agg.pyc in draw(self)
399
400 self.renderer = self.get_renderer()
--> 401 self.figure.draw(self.renderer)
402
403 def get_renderer(self):
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/artist.pyc in draw_wrapper(artist, renderer, *args, **kwargs)
53 def draw_wrapper(artist, renderer, *args, **kwargs):
54 before(artist, renderer)
---> 55 draw(artist, renderer, *args, **kwargs)
56 after(artist, renderer)
57
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/figure.pyc in draw(self, renderer)
882 dsu.sort(key=itemgetter(0))
883 for zorder, func, args in dsu:
--> 884 func(*args)
885
886 renderer.close_group('figure')
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/artist.pyc in draw_wrapper(artist, renderer, *args, **kwargs)
53 def draw_wrapper(artist, renderer, *args, **kwargs):
54 before(artist, renderer)
---> 55 draw(artist, renderer, *args, **kwargs)
56 after(artist, renderer)
57
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/axes.pyc in draw(self, renderer, inframe)
1981
1982 for zorder, a in dsu:
-> 1983 a.draw(renderer)
1984
1985 renderer.close_group('axes')
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/artist.pyc in draw_wrapper(artist, renderer, *args, **kwargs)
53 def draw_wrapper(artist, renderer, *args, **kwargs):
54 before(artist, renderer)
---> 55 draw(artist, renderer, *args, **kwargs)
56 after(artist, renderer)
57
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/axis.pyc in draw(self, renderer, *args, **kwargs)
1035
1036 ticks_to_draw = self._update_ticks(renderer)
-> 1037 ticklabelBoxes, ticklabelBoxes2 = self._get_tick_bboxes(ticks_to_draw, renderer)
1038
1039 for tick in ticks_to_draw:
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/axis.pyc in _get_tick_bboxes(self, ticks, renderer)
986 for tick in ticks:
987 if tick.label1On and tick.label1.get_visible():
--> 988 extent = tick.label1.get_window_extent(renderer)
989 ticklabelBoxes.append(extent)
990 if tick.label2On and tick.label2.get_visible():
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/text.pyc in get_window_extent(self, renderer, dpi)
745 raise RuntimeError('Cannot get window extent w/o renderer')
746
--> 747 bbox, info = self._get_layout(self._renderer)
748 x, y = self.get_position()
749 x, y = self.get_transform().transform_point((x, y))
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/text.pyc in _get_layout(self, renderer)
307 w, h, d = get_text_width_height_descent(clean_line,
308 self._fontproperties,
--> 309 ismath=ismath)
310 else:
311 w, h, d = 0, 0, 0
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/backends/backend_agg.pyc in get_text_width_height_descent(self, s, prop, ismath)
172 fontsize = prop.get_size_in_points()
173 w, h, d = texmanager.get_text_width_height_descent(s, fontsize,
--> 174 renderer=self)
175 return w, h, d
176
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/texmanager.pyc in get_text_width_height_descent(self, tex, fontsize, renderer)
606 dvifile = self.make_dvi(tex, fontsize)
607 dvi = dviread.Dvi(dvifile, 72*dpi_fraction)
--> 608 page = iter(dvi).next()
609 dvi.close()
610 # A total height (including the descent) needs to be returned.
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/dviread.pyc in __iter__(self)
63 """
64 while True:
---> 65 have_page = self._read()
66 if have_page:
67 yield self._output()
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/dviread.pyc in _read(self)
119 while True:
120 byte = ord(self.file.read(1))
--> 121 self._dispatch(byte)
122 # if self.state == _dvistate.inpage:
123 # matplotlib.verbose.report(
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/dviread.pyc in _dispatch(self, byte)
207 c, s, d, a, l = [ self._arg(x) for x in (4, 4, 4, 1, 1) ]
208 n = self.file.read(a+l)
--> 209 self._fnt_def(k, c, s, d, a, l, n)
210 elif byte == 247:
211 i, num, den, mag, k = [ self._arg(x) for x in (1, 4, 4, 4, 1) ]
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/dviread.pyc in _fnt_def(self, k, c, s, d, a, l, n)
368 # (d, tfm.design_size, n)
369
--> 370 vf = _vffile(n[-l:])
371
372 self.fonts[k] = DviFont(scale=s, tfm=tfm, texname=n, vf=vf)
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/dviread.pyc in _vffile(texname)
879
880 def _vffile(texname):
--> 881 return _fontfile(texname, Vf, '.vf', _vfcache)
882
883
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/dviread.pyc in _fontfile(texname, class_, suffix, cache)
868 filename = find_tex_file(texname + suffix)
869 if filename:
--> 870 result = class_(filename)
871 else:
872 result = None
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/dviread.pyc in __init__(self, filename)
477 self._chars = {}
478 self._packet_ends = None
--> 479 self._read()
480 self.close()
481
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/dviread.pyc in _read(self)
119 while True:
120 byte = ord(self.file.read(1))
--> 121 self._dispatch(byte)
122 # if self.state == _dvistate.inpage:
123 # matplotlib.verbose.report(
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/dviread.pyc in _dispatch(self, byte)
506 self._init_packet(pl, cc, tfm)
507 elif 243 <= byte <= 246:
--> 508 Dvi._dispatch(self, byte)
509 elif byte == 247: # preamble
510 i, k = self._arg(1), self._arg(1)
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/dviread.pyc in _dispatch(self, byte)
207 c, s, d, a, l = [ self._arg(x) for x in (4, 4, 4, 1, 1) ]
208 n = self.file.read(a+l)
--> 209 self._fnt_def(k, c, s, d, a, l, n)
210 elif byte == 247:
211 i, num, den, mag, k = [ self._arg(x) for x in (1, 4, 4, 4, 1) ]
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/dviread.pyc in _fnt_def(self, k, *args)
544
545 def _fnt_def(self, k, *args):
--> 546 Dvi._fnt_def(self, k, *args)
547 if self._first_font is None:
548 self._first_font = k
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/dviread.pyc in _fnt_def(self, k, c, s, d, a, l, n)
370 vf = _vffile(n[-l:])
371
--> 372 self.fonts[k] = DviFont(scale=s, tfm=tfm, texname=n, vf=vf)
373
374 def _post(self):
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/dviread.pyc in __init__(self, scale, tfm, texname, vf)
416 self.size = scale * (72.0 / (72.27 * 2**16))
417 try:
--> 418 nchars = max(tfm.width.iterkeys()) + 1
419 except ValueError:
420 nchars = 0
AttributeError: 'NoneType' object has no attribute 'width'
This won't either
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/backends/backend_qt4agg.pyc in paintEvent(self, e)
80
81 if self.replot:
---> 82 FigureCanvasAgg.draw(self)
83 self.replot = False
84
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/backends/backend_agg.pyc in draw(self)
399
400 self.renderer = self.get_renderer()
--> 401 self.figure.draw(self.renderer)
402
403 def get_renderer(self):
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/artist.pyc in draw_wrapper(artist, renderer, *args, **kwargs)
53 def draw_wrapper(artist, renderer, *args, **kwargs):
54 before(artist, renderer)
---> 55 draw(artist, renderer, *args, **kwargs)
56 after(artist, renderer)
57
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/figure.pyc in draw(self, renderer)
882 dsu.sort(key=itemgetter(0))
883 for zorder, func, args in dsu:
--> 884 func(*args)
885
886 renderer.close_group('figure')
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/artist.pyc in draw_wrapper(artist, renderer, *args, **kwargs)
53 def draw_wrapper(artist, renderer, *args, **kwargs):
54 before(artist, renderer)
---> 55 draw(artist, renderer, *args, **kwargs)
56 after(artist, renderer)
57
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/axes.pyc in draw(self, renderer, inframe)
1981
1982 for zorder, a in dsu:
-> 1983 a.draw(renderer)
1984
1985 renderer.close_group('axes')
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/artist.pyc in draw_wrapper(artist, renderer, *args, **kwargs)
53 def draw_wrapper(artist, renderer, *args, **kwargs):
54 before(artist, renderer)
---> 55 draw(artist, renderer, *args, **kwargs)
56 after(artist, renderer)
57
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/axis.pyc in draw(self, renderer, *args, **kwargs)
1035
1036 ticks_to_draw = self._update_ticks(renderer)
-> 1037 ticklabelBoxes, ticklabelBoxes2 = self._get_tick_bboxes(ticks_to_draw, renderer)
1038
1039 for tick in ticks_to_draw:
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/axis.pyc in _get_tick_bboxes(self, ticks, renderer)
986 for tick in ticks:
987 if tick.label1On and tick.label1.get_visible():
--> 988 extent = tick.label1.get_window_extent(renderer)
989 ticklabelBoxes.append(extent)
990 if tick.label2On and tick.label2.get_visible():
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/text.pyc in get_window_extent(self, renderer, dpi)
745 raise RuntimeError('Cannot get window extent w/o renderer')
746
--> 747 bbox, info = self._get_layout(self._renderer)
748 x, y = self.get_position()
749 x, y = self.get_transform().transform_point((x, y))
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/text.pyc in _get_layout(self, renderer)
307 w, h, d = get_text_width_height_descent(clean_line,
308 self._fontproperties,
--> 309 ismath=ismath)
310 else:
311 w, h, d = 0, 0, 0
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/backends/backend_agg.pyc in get_text_width_height_descent(self, s, prop, ismath)
172 fontsize = prop.get_size_in_points()
173 w, h, d = texmanager.get_text_width_height_descent(s, fontsize,
--> 174 renderer=self)
175 return w, h, d
176
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/texmanager.pyc in get_text_width_height_descent(self, tex, fontsize, renderer)
606 dvifile = self.make_dvi(tex, fontsize)
607 dvi = dviread.Dvi(dvifile, 72*dpi_fraction)
--> 608 page = iter(dvi).next()
609 dvi.close()
610 # A total height (including the descent) needs to be returned.
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/dviread.pyc in __iter__(self)
63 """
64 while True:
---> 65 have_page = self._read()
66 if have_page:
67 yield self._output()
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/dviread.pyc in _read(self)
119 while True:
120 byte = ord(self.file.read(1))
--> 121 self._dispatch(byte)
122 # if self.state == _dvistate.inpage:
123 # matplotlib.verbose.report(
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/dviread.pyc in _dispatch(self, byte)
207 c, s, d, a, l = [ self._arg(x) for x in (4, 4, 4, 1, 1) ]
208 n = self.file.read(a+l)
--> 209 self._fnt_def(k, c, s, d, a, l, n)
210 elif byte == 247:
211 i, num, den, mag, k = [ self._arg(x) for x in (1, 4, 4, 4, 1) ]
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/dviread.pyc in _fnt_def(self, k, c, s, d, a, l, n)
361 def _fnt_def(self, k, c, s, d, a, l, n):
362 tfm = _tfmfile(n[-l:])
--> 363 if c != 0 and tfm.checksum != 0 and c != tfm.checksum:
364 raise ValueError, 'tfm checksum mismatch: %s'%n
365 # It seems that the assumption behind the following check is incorrect:
AttributeError: 'NoneType' object has no attribute 'checksum'
--------
My system: A Macbook Pro with OS X 10.7.4, 4GB ram. I'm using the latest py27-ipython from macports (@12.1). I also installed the qtconsole dependencies and therefore py27-pyqt4 last week using macports.
Darwin macbookpro2009.fritz.box 11.4.0 Darwin Kernel Version 11.4.0: Mon Apr 9 19:32:15 PDT 2012; root:xnu-1699268~1/RELEASE_X86_64 x86_64
Matplotlib-Version: 1.1.0
Backend Qt4Agg version 4.9.1
At the moment I can just stick with the MacOSX backend, but hopefully this message will help someone fix the bug.
Best regards,
Felix Patzelt