@@ -75,52 +75,83 @@ def __init__(self, figure, num):
7575 cbook .EventEmitter .__init__ (self )
7676 self .num = num
7777
78+ self ._h = 0
79+ self ._w = 0
80+ self ._figure = None
81+ self .key_press_handler_id = None
7882 self ._backend = get_backend ()
7983 self ._mainloop = self ._backend .MainLoop ()
84+ self .toolmanager = self ._get_toolmanager ()
85+
8086 self .window = self ._backend .Window ('Figure %d' % num )
8187 self .window .mpl_connect ('window_destroy_event' , self ._destroy )
8288
83- self .canvas = self ._backend .FigureCanvas (figure , manager = self )
84-
85- self .key_press_handler_id = self .canvas .mpl_connect ('key_press_event' ,
86- self .key_press ) if rcParams ['toolbar' ] != 'toolmanager' else None
87-
88- w = int (self .canvas .figure .bbox .width )
89- h = int (self .canvas .figure .bbox .height )
90-
91- self .window .add_element (self .canvas , True , 'center' )
92-
93- self .toolmanager = self ._get_toolmanager ()
89+ self .figure = figure
9490 self .toolbar = self ._get_toolbar ()
9591
9692 if self .toolmanager :
9793 tools .add_tools_to_manager (self .toolmanager )
9894 if self .toolbar :
9995 tools .add_tools_to_container (self .toolbar )
10096 self .statusbar = self ._backend .Statusbar (self .toolmanager )
101- h += self .window .add_element (self .statusbar , False , 'south' )
97+ self ._h += self .window .add_element (self .statusbar , False ,
98+ 'south' )
10299
103100 if self .toolbar is not None :
104- h += self .window .add_element (self .toolbar , False , 'south' )
101+ self . _h += self .window .add_element (self .toolbar , False , 'south' )
105102
106- self .window .set_default_size (w , h )
103+ self .window .set_default_size (self . _w , self . _h )
107104 self ._full_screen_flag = False
108105
109106 if is_interactive ():
110107 self .window .show ()
111108
109+ @property
110+ def figure (self ):
111+ return self ._figure
112+
113+ @figure .setter
114+ def figure (self , figure ):
115+ if not figure :
116+ return
117+
118+ if self .key_press_handler_id :
119+ self .figure .canvas .mpl_disconnect (self .key_press_handler_id )
120+
121+ if not figure .canvas :
122+ self ._backend .FigureCanvas (figure , manager = self )
123+
124+ if rcParams ['toolbar' ] != 'toolmanager' :
125+ self .key_press_handler_id = figure .canvas .mpl_connect (
126+ 'key_press_event' , self .key_press )
127+
128+ if not self ._figure :
129+ self ._add_figure_to_window (figure )
130+ else :
131+ self .window .replace_element (self ._figure .canvas , figure .canvas )
132+
133+ self ._figure = figure
134+ self .toolmanager .figure = figure
135+
112136 def notify_axes_change (fig ):
113137 'this will be called whenever the current axes is changed'
114138 if self .toolmanager is None and self .toolbar is not None :
115139 self .toolbar .update ()
116- self .canvas .figure .add_axobserver (notify_axes_change )
140+ figure .add_axobserver (notify_axes_change )
141+
142+ def _add_figure_to_window (self , figure ):
143+ self ._w += int (figure .bbox .width )
144+ self ._h += int (figure .bbox .height )
145+ self .window .add_element (figure .canvas , True , 'center' )
146+ self .window .set_default_size (self ._w , self ._h )
147+ figure .canvas .show ()
117148
118149 def key_press (self , event ):
119150 """
120151 Implement the default mpl key bindings defined at
121152 :ref:`key-event-handling`
122153 """
123- key_press_handler (event , self .canvas , self . canvas .toolbar )
154+ key_press_handler (event , self .figure . canvas , self .toolbar )
124155
125156 def _destroy (self , event = None ):
126157 # Callback from the when the window wants to destroy itself
@@ -132,7 +163,8 @@ def destroy(self, *args):
132163 """Called to destroy this FigureManager, gets called by Gcf through
133164 event magic.
134165 """
135- self .canvas .destroy ()
166+ if self .figure and self .figure .canvas :
167+ self .figure .canvas .destroy ()
136168 if self .toolbar :
137169 self .toolbar .destroy ()
138170 self .window .destroy ()
@@ -173,15 +205,15 @@ def _get_toolbar(self):
173205 if rcParams ['toolbar' ] == 'toolmanager' :
174206 toolbar = self ._backend .Toolbar (self .toolmanager )
175207 elif rcParams ['toolbar' ] == 'toolbar2' :
176- toolbar = self ._backend .Toolbar2 (self .canvas , self .window )
208+ toolbar = self ._backend .Toolbar2 (self .figure . canvas , self .window )
177209 else :
178210 toolbar = None
179211 return toolbar
180212
181213 def _get_toolmanager (self ):
182214 # must be initialised after toolbar has been setted
183215 if rcParams ['toolbar' ] != 'toolbar2' :
184- toolmanager = ToolManager (self . canvas )
216+ toolmanager = ToolManager (self )
185217 else :
186218 toolmanager = None
187219 return toolmanager
@@ -234,21 +266,41 @@ class ToolManager(object):
234266 `LockDraw` object to know if the message is available to write
235267 """
236268
237- def __init__ (self , canvas ):
238- self .canvas = canvas
239-
240- self ._key_press_handler_id = self .canvas .mpl_connect (
241- 'key_press_event' , self ._key_press )
242-
269+ def __init__ (self , manager ):
270+ self ._figure = None
243271 self ._tools = {}
244272 self ._keys = {}
245273 self ._toggled = {}
246274 self ._callbacks = cbook .CallbackRegistry ()
275+ self ._key_press_handler_id = None
247276
248277 # to process keypress event
249278 self .keypresslock = widgets .LockDraw ()
250279 self .messagelock = widgets .LockDraw ()
251280
281+ self .manager = manager
282+ self .figure = manager .figure
283+
284+ @property
285+ def figure (self ):
286+ return self ._figure
287+
288+ @figure .setter
289+ def figure (self , figure ):
290+ if not figure :
291+ return
292+
293+ if self ._key_press_handler_id :
294+ self .figure .canvas .mpl_disconnect (self ._key_press_handler_id )
295+
296+ self ._key_press_handler_id = figure .canvas .mpl_connect (
297+ 'key_press_event' , self ._key_press )
298+
299+ for tool in self ._tools .values ():
300+ tool .figure = figure
301+
302+ self ._figure = figure
303+
252304 def toolmanager_connect (self , s , func ):
253305 """
254306 Connect event with string *s* to *func*.
0 commit comments