Thanks for the report.  Indeed this is a problem.  I've filed a pull 
request with a fix here:

https://github.com/matplotlib/matplotlib/pull/387

There were a few other places where we weren't absolutely ensuring the 
passing of ints to Tkinter that I also fixed.

I'm surprised this bug (which really lies in Tkinter) isn't more widely 
known -- searching the Python bug tracker revealed nothing.  It would be 
great to follow-up there (with a standalone Tkinter-crashing example) if 
you're so inclined.

Cheers,
Mike

On 06/30/2011 11:48 AM, hans.ber...@arcor.de wrote:
> Hi,
>
> sorry if this has already been addressed. I did a search on the archives, but 
> even though that turned up lots of hits, none of them seemed to be related to 
> the issue.
>
> The following very simple example will reliably crash in Python 2.7.[0-2] 
> with matplotlib 1.0.1 under a 64 bit German Windows (and probably also on 
> other machines where you can set an equivalent locale):
>
> ---
>
> import matplotlib
>
> from pylab import arange,sin,pi
> t = arange(0.0, 2.0, 0.01)
> s = sin(2*pi*t)
>
> import locale
> # the locale setting in the next line makes pyplot.plot crash
> # have to use "deu_deu" instead of "de_DE" on German Windows
> locale.setlocale(locale.LC_ALL, 'deu_deu')
> print "locale =", locale.getlocale(locale.LC_NUMERIC)
>
> print "will plot ..."
> matplotlib.pyplot.plot(t, s, linewidth=1.0)
> # doesn't get this far with German locale
> print "will show ..."
> matplotlib.pyplot.show()
>
> ---
>
> The program crashes in pyplot.plot(). The stacktrace is:
>
> ---
>
> Traceback (most recent call last):
>    File "C:\[...]\badScreenSizeMPL.py", line 14, in<module>
>      matplotlib.pyplot.plot(t, s, linewidth=1.0)
>    File "C:\Python27\lib\site-packages\matplotlib\pyplot.py", line 2279, in 
> plot
>      ax = gca()
>    File "C:\Python27\lib\site-packages\matplotlib\pyplot.py", line 593, in gca
>      ax =  gcf().gca(**kwargs)
>    File "C:\Python27\lib\site-packages\matplotlib\pyplot.py", line 292, in gcf
>      return figure()
>    File "C:\Python27\lib\site-packages\matplotlib\pyplot.py", line 270, in 
> figure
>      **kwargs)
>    File "C:\Python27\lib\site-packages\matplotlib\backends\backend_tkagg.py", 
> line 82, in new_figure_manager
>      figManager = FigureManagerTkAgg(canvas, num, window)
>    File "C:\Python27\lib\site-packages\matplotlib\backends\backend_tkagg.py", 
> line 400, in __init__
>      self.toolbar = NavigationToolbar2TkAgg( canvas, self.window )
>    File "C:\Python27\lib\site-packages\matplotlib\backends\backend_tkagg.py", 
> line 667, in __init__
>      NavigationToolbar2.__init__(self, canvas)
>    File "C:\Python27\lib\site-packages\matplotlib\backend_bases.py", line 
> 2310, in __init__
>      self._init_toolbar()
>    File "C:\Python27\lib\site-packages\matplotlib\backends\backend_tkagg.py", 
> line 711, in _init_toolbar
>      borderwidth=2)
>    File "C:\Python27\lib\lib-tk\Tkinter.py", line 2466, in __init__
>      Widget.__init__(self, master, 'frame', cnf, {}, extra)
>    File "C:\Python27\lib\lib-tk\Tkinter.py", line 1977, in __init__
>      (widgetName, self._w) + extra + self._options(cnf))
> _tkinter.TclError: bad screen distance "640.0"
> Fatal Python error: PyEval_RestoreThread: NULL tstate
>
> ---
>
> The reason appears to be that at some point Tkinter tries to parse the string 
> "640.0" as a number, which does not work in a locale where the decimal marker 
> is, e.g., the comma (as in German). If you comment out the locale setting (or 
> set it to "C"), the example works.
>
> The float value of 640.0 seems to emerge from the following piece of code in 
> "backend_tkagg.py".
>
> ---
>
> class NavigationToolbar2TkAgg(NavigationToolbar2, Tk.Frame):
>
>     [...]
>
>      def _init_toolbar(self):
>          xmin, xmax = self.canvas.figure.bbox.intervalx
>          height, width = 50, xmax-xmin
>          Tk.Frame.__init__(self, master=self.window,
>                            width=width, height=height,
>                            borderwidth=2)
>
> ---
>
> Through the initialization by difference, "width" is a 'numpy.float64'; 
> changing the assignment of "height, width" to
>
>     height, width = 50, int(xmax-xmin)
>
> makes the example program run through without problems.
>
> One the one hand, I guess this should be fixed in the depths of Tkinter 
> (where apparently a number type gets stringified just to be parsed again as a 
> number). One the other hand, it would be very simple fix in the TkAgg 
> backend, and it seems sensible to make the width an int. (Perhaps even the 
> intervals in intervalx should already be ints?)
>
> I would like to point out that, even though this might sound like a contrived 
> problem, it can easily occur where machines are set up with different 
> languages; we had a tool run on an English Windows, but we got the stack 
> trace from above when we moved that tool to a German Windows which we 
> believed to be set up in just the same way as the original Windows. It took 
> us a day to figure out what the reason behind the cryptic Tkinter error was.
>
> Kind regards,
> H.
>
>
> ------------------------------------------------------------------------------
> All of the data generated in your IT infrastructure is seriously valuable.
> Why? It contains a definitive record of application performance, security
> threats, fraudulent activity, and more. Splunk takes this data and makes
> sense of it. IT sense. And common sense.
> http://p.sf.net/sfu/splunk-d2d-c2
> _______________________________________________
> Matplotlib-users mailing list
> Matplotlib-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/matplotlib-users


-- 
Michael Droettboom
Science Software Branch
Space Telescope Science Institute
Baltimore, Maryland, USA


------------------------------------------------------------------------------
All of the data generated in your IT infrastructure is seriously valuable.
Why? It contains a definitive record of application performance, security 
threats, fraudulent activity, and more. Splunk takes this data and makes 
sense of it. IT sense. And common sense.
http://p.sf.net/sfu/splunk-d2d-c2
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Reply via email to