问题
File "main.py", line 52, in <module>
r2n(name)
File "C:\Users\Riki\Documents\Universita\Erasmus\Personalization and Metadata modeling 02817\Final Project\friends_followers__redis_to_networkx.py", line 69, in r2n
**nx.draw_spring(g,node_size=50,node_color='#32CD32',node_shape='o',edge_color='.1',with_labels=True,width=0.5)**
File "C:\Python27\lib\site-packages\networkx-1.6-py2.7.egg\networkx\drawing\nx_pylab.py", line 876, in draw_spring
draw(G,spring_layout(G),**kwargs)
File "C:\Python27\lib\site-packages\networkx-1.6-py2.7.egg\networkx\drawing\nx_pylab.py", line 124, in draw
cf=pylab.gcf()
File "C:\Python27\lib\site-packages\matplotlib\pyplot.py", line 369, in gcf
return figure()
File "C:\Python27\lib\site-packages\matplotlib\pyplot.py", line 343, in figure
**kwargs)
File "C:\Python27\lib\site-packages\matplotlib\backends\backend_tkagg.py", line 81, in new_figure_manager
canvas = FigureCanvasTkAgg(figure, master=window)
File "C:\Python27\lib\site-packages\matplotlib\backends\backend_tkagg.py", line 188, in __init__
self._tkcanvas.create_image(w/2, h/2, image=self._tkphoto)
File "C:\Python27\lib\lib-tk\Tkinter.py", line 2198, in create_image
return self._create('image', args, kw)
File "C:\Python27\lib\lib-tk\Tkinter.py", line 2189, in _create
*(args + self._options(cnf, kw))))
**_tkinter.TclError: bad screen distance "320.0"**
Hi, I'm working on Python 2.7 for Windows 64bit. Suddenly that problem occurred, but my code should be ok because was working previously (without any change the plots were visible).
I think that is a problem with the library, what shall I do?
回答1:
Try converting your coordinates to an int before creating the canvas item. For example:
self._tkcanvas.create_image(int(w/2), int(h/2), image=self._tkphoto)
I appreciate this answer very much, as it helped me a lot; I wish I could add a separate answer, but I can't as it's closed - so posting an edit:
A solution that worked for me that didn't require changing the matplotlib
library files, is to simply make a new class to override a method, the two problematic methods being __init__
and resize
(and strangely, all I need is to overload resize
, didn't even had to put in the fix there, and it started working for me?)
Anyways, take note that the below is copied from the Python2.7 Matplotlib - you're probably better off checking for your local matplotlib version first, and copying from there:
# copy of /usr/lib/pymodules/python2.7/matplotlib/backends/backend_tkagg.py
# with fix:
class FigureCanvasTkAggFix(FigureCanvasTkAgg):
def __init__(self, figure, master=None, resize_callback=None):
matplotlib.backends.backend_tkagg.FigureCanvasAgg.__init__(self, figure)
self._idle = True
t1,t2,w,h = self.figure.bbox.bounds
w, h = int(w), int(h)
self._tkcanvas = tk.Canvas(
master=master, width=w, height=h, borderwidth=4)
self._tkphoto = tk.PhotoImage(
master=self._tkcanvas, width=w, height=h)
self._tkcanvas.create_image(int(w/2), int(h/2), image=self._tkphoto) # fix
self._resize_callback = resize_callback
self._tkcanvas.bind("<Configure>", self.resize)
self._tkcanvas.bind("<Key>", self.key_press)
self._tkcanvas.bind("<Motion>", self.motion_notify_event)
self._tkcanvas.bind("<KeyRelease>", self.key_release)
for name in "<Button-1>", "<Button-2>", "<Button-3>":
self._tkcanvas.bind(name, self.button_press_event)
for name in "<ButtonRelease-1>", "<ButtonRelease-2>", "<ButtonRelease-3>":
self._tkcanvas.bind(name, self.button_release_event)
for name in "<Button-4>", "<Button-5>":
self._tkcanvas.bind(name, self.scroll_event)
root = self._tkcanvas.winfo_toplevel()
root.bind("<MouseWheel>", self.scroll_event_windows)
self._master = master
self._tkcanvas.focus_set()
self.sourced = dict()
def on_idle(*ignore):
self.idle_event()
return True
def resize(self, event):
width, height = event.width, event.height
printse("WH", width, height, "\n")
if self._resize_callback is not None:
self._resize_callback(event)
# compute desired figure size in inches
dpival = self.figure.dpi
winch = width/dpival
hinch = height/dpival
self.figure.set_size_inches(winch, hinch)
self._tkcanvas.delete(self._tkphoto)
self._tkphoto = tk.PhotoImage(
master=self._tkcanvas, width=width, height=height)
self._tkcanvas.create_image(width/2,height/2,image=self._tkphoto)
self.resize_event()
self.show()
来源:https://stackoverflow.com/questions/10374841/matplotlib-tkinter-tclerror-bad-screen-distance-320-0