Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit795c171

Browse files
committed
Backend class to factor out common code.
1 parent6ce2f06 commit795c171

26 files changed

+465
-841
lines changed

‎lib/matplotlib/backend_bases.py‎

Lines changed: 103 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,11 @@
5252
importmatplotlib.colorsascolors
5353
importmatplotlib.transformsastransforms
5454
importmatplotlib.widgetsaswidgets
55-
#import matplotlib.path as path
5655
frommatplotlibimportrcParams
5756
frommatplotlibimportis_interactive
5857
frommatplotlibimportget_backend
59-
frommatplotlib._pylab_helpersimportGcf
6058
frommatplotlibimportlines
59+
frommatplotlib._pylab_helpersimportGcf
6160

6261
frommatplotlib.transformsimportBbox,TransformedBbox,Affine2D
6362

@@ -142,60 +141,118 @@ def get_registered_canvas_class(format):
142141
returnbackend_class
143142

144143

145-
classShowBase(object):
146-
"""
147-
Simple base class to generate a show() callable in backends.
144+
class_Backend(object):
145+
# A backend can be defined by using the following pattern:
146+
#
147+
# @_Backend.export
148+
# class FooBackend(_Backend):
149+
# # override the attributes and methods documented below.
148150

149-
Subclass must override mainloop() method.
150-
"""
151-
def__call__(self,block=None):
151+
# The following attributes and methods must be overridden by subclasses.
152+
153+
# The `FigureCanvas` and `FigureManager` classes must be defined.
154+
FigureCanvas=None
155+
FigureManager=None
156+
157+
# The following methods must be left as None for non-interactive backends.
158+
# For interactive backends, `trigger_manager_draw` should be a function
159+
# taking a manager as argument and triggering a canvas draw, and `mainloop`
160+
# should be a function taking no argument and starting the backend main
161+
# loop.
162+
trigger_manager_draw=None
163+
mainloop=None
164+
165+
# The following methods will be automatically defined and exported, but
166+
# can be overridden.
167+
168+
@classmethod
169+
defnew_figure_manager(cls,num,*args,**kwargs):
170+
"""Create a new figure manager instance.
171+
"""
172+
# This import needs to happen here due to circular imports.
173+
frommatplotlib.figureimportFigure
174+
fig_cls=kwargs.pop('FigureClass',Figure)
175+
fig=fig_cls(*args,**kwargs)
176+
returncls.new_figure_manager_given_figure(num,fig)
177+
178+
@classmethod
179+
defnew_figure_manager_given_figure(cls,num,figure):
180+
"""Create a new figure manager instance for the given figure.
152181
"""
153-
Show all figures. If *block* is not None, then
154-
it is a boolean that overrides all other factors
155-
determining whether show blocks by calling mainloop().
156-
The other factors are:
157-
it does not block if run inside ipython's "%pylab" mode
158-
it does not block in interactive mode.
182+
canvas=cls.FigureCanvas(figure)
183+
manager=cls.FigureManager(canvas,num)
184+
returnmanager
185+
186+
@classmethod
187+
defdraw_if_interactive(cls):
188+
ifcls.trigger_manager_drawisnotNoneandis_interactive():
189+
manager=Gcf.get_active()
190+
ifmanager:
191+
cls.trigger_manager_draw()
192+
193+
@classmethod
194+
defshow(cls,block=None):
195+
"""Show all figures.
196+
197+
`show` blocks by calling `mainloop` if *block* is ``True``, or if it
198+
is ``None`` and we are neither in IPython's ``%pylab`` mode, nor in
199+
`interactive` mode.
159200
"""
201+
ifcls.mainloopisNone:
202+
return
160203
managers=Gcf.get_all_fig_managers()
161204
ifnotmanagers:
162205
return
163-
164206
formanagerinmanagers:
165207
manager.show()
208+
ifblockisNone:
209+
# Hack: Are we in IPython's pylab mode?
210+
frommatplotlibimportpyplot
211+
try:
212+
# IPython versions >= 0.10 tack the _needmain attribute onto
213+
# pyplot.show, and always set it to False, when in %pylab mode.
214+
ipython_pylab=notpyplot.show._needmain
215+
exceptAttributeError:
216+
ipython_pylab=False
217+
block=notipython_pylabandnotis_interactive()
218+
# TODO: The above is a hack to get the WebAgg backend working with
219+
# ipython's `%pylab` mode until proper integration is implemented.
220+
ifget_backend()=="WebAgg":
221+
block=True
222+
ifblock:
223+
cls.mainloop()
224+
225+
# This method is the one actually exporting the required methods.
226+
227+
@staticmethod
228+
defexport(cls):
229+
fornamein ["FigureCanvas",
230+
"FigureManager",
231+
"new_figure_manager",
232+
"new_figure_manager_given_figure",
233+
"draw_if_interactive",
234+
"show"]:
235+
setattr(sys.modules[cls.__module__],name,getattr(cls,name))
236+
237+
# For back-compatibility, generate a shim `Show` class.
238+
239+
classShow(ShowBase):
240+
defmainloop(self):
241+
returncls.mainloop()
242+
243+
setattr(sys.modules[cls.__module__],"Show",Show)
244+
returncls
245+
246+
247+
classShowBase(_Backend):
248+
"""
249+
Simple base class to generate a show() callable in backends.
166250
167-
ifblockisnotNone:
168-
ifblock:
169-
self.mainloop()
170-
return
171-
else:
172-
return
173-
174-
# Hack: determine at runtime whether we are
175-
# inside ipython in pylab mode.
176-
frommatplotlibimportpyplot
177-
try:
178-
ipython_pylab=notpyplot.show._needmain
179-
# IPython versions >= 0.10 tack the _needmain
180-
# attribute onto pyplot.show, and always set
181-
# it to False, when in %pylab mode.
182-
ipython_pylab=ipython_pylabandget_backend()!='WebAgg'
183-
# TODO: The above is a hack to get the WebAgg backend
184-
# working with ipython's `%pylab` mode until proper
185-
# integration is implemented.
186-
exceptAttributeError:
187-
ipython_pylab=False
188-
189-
# Leave the following as a separate step in case we
190-
# want to control this behavior with an rcParam.
191-
ifipython_pylab:
192-
return
193-
194-
ifnotis_interactive()orget_backend()=='WebAgg':
195-
self.mainloop()
251+
Subclass must override mainloop() method.
252+
"""
196253

197-
defmainloop(self):
198-
pass
254+
def__call__(self,block=None):
255+
returnself.show(block=block)
199256

200257

201258
classRendererBase(object):

‎lib/matplotlib/backends/backend_agg.py‎

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@
2929
fromcollectionsimportOrderedDict
3030
frommathimportradians,cos,sin
3131
frommatplotlibimportverbose,rcParams,__version__
32-
frommatplotlib.backend_basesimport (RendererBase,FigureManagerBase,
33-
FigureCanvasBase)
32+
frommatplotlib.backend_basesimport (
33+
_Backend,FigureCanvasBase,FigureManagerBase,RendererBase)
3434
frommatplotlib.cbookimportmaxdict,restrict_dict
3535
frommatplotlib.figureimportFigure
3636
frommatplotlib.font_managerimportfindfont,get_font
@@ -397,24 +397,6 @@ def post_processing(image, dpi):
397397
gc,l+ox,height-b-h+oy,img)
398398

399399

400-
defnew_figure_manager(num,*args,**kwargs):
401-
"""
402-
Create a new figure manager instance
403-
"""
404-
FigureClass=kwargs.pop('FigureClass',Figure)
405-
thisFig=FigureClass(*args,**kwargs)
406-
returnnew_figure_manager_given_figure(num,thisFig)
407-
408-
409-
defnew_figure_manager_given_figure(num,figure):
410-
"""
411-
Create a new figure manager instance for the given figure.
412-
"""
413-
canvas=FigureCanvasAgg(figure)
414-
manager=FigureManagerBase(canvas,num)
415-
returnmanager
416-
417-
418400
classFigureCanvasAgg(FigureCanvasBase):
419401
"""
420402
The canvas the figure renders into. Calls the draw and print fig
@@ -609,4 +591,7 @@ def print_tif(self, filename_or_obj, *args, **kwargs):
609591
print_tiff=print_tif
610592

611593

612-
FigureCanvas=FigureCanvasAgg
594+
@_Backend.export
595+
class_BackendAgg(_Backend):
596+
FigureCanvas=FigureCanvasAgg
597+
FigureManager=FigureManagerBase

‎lib/matplotlib/backends/backend_cairo.py‎

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,12 @@
5252
del_version_required
5353

5454
frommatplotlib.backend_basesimport (
55-
RendererBase,GraphicsContextBase,FigureManagerBase,FigureCanvasBase)
56-
frommatplotlib.figureimportFigure
57-
frommatplotlib.mathtextimportMathTextParser
58-
frommatplotlib.pathimportPath
59-
frommatplotlib.transformsimportBbox,Affine2D
55+
_Backend,FigureCanvasBase,FigureManagerBase,GraphicsContextBase,
56+
RendererBase)
57+
frommatplotlib.figureimportFigure
58+
frommatplotlib.mathtextimportMathTextParser
59+
frommatplotlib.pathimportPath
60+
frommatplotlib.transformsimportBbox,Affine2D
6061
frommatplotlib.font_managerimportttfFontProperty
6162

6263

@@ -549,4 +550,7 @@ def _save(self, fo, fmt, **kwargs):
549550
fo.close()
550551

551552

552-
FigureCanvas=FigureCanvasCairo
553+
@_Backend.export
554+
class_BackendCairo(_Backend):
555+
FigureCanvas=FigureCanvasCairo
556+
FigureManager=FigureManagerBase

‎lib/matplotlib/backends/backend_gdk.py‎

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@
2424
frommatplotlibimportrcParams
2525
frommatplotlib._pylab_helpersimportGcf
2626
frommatplotlib.backend_basesimport (
27-
RendererBase,GraphicsContextBase,FigureManagerBase,FigureCanvasBase)
27+
_Backend,FigureCanvasBase,FigureManagerBase,GraphicsContextBase,
28+
RendererBase)
2829
frommatplotlib.cbookimportrestrict_dict,warn_deprecated
2930
frommatplotlib.figureimportFigure
3031
frommatplotlib.mathtextimportMathTextParser
@@ -381,24 +382,6 @@ def set_linewidth(self, w):
381382
self.gdkGC.line_width=max(1,int(np.round(pixels)))
382383

383384

384-
defnew_figure_manager(num,*args,**kwargs):
385-
"""
386-
Create a new figure manager instance
387-
"""
388-
FigureClass=kwargs.pop('FigureClass',Figure)
389-
thisFig=FigureClass(*args,**kwargs)
390-
returnnew_figure_manager_given_figure(num,thisFig)
391-
392-
393-
defnew_figure_manager_given_figure(num,figure):
394-
"""
395-
Create a new figure manager instance for the given figure.
396-
"""
397-
canvas=FigureCanvasGDK(figure)
398-
manager=FigureManagerBase(canvas,num)
399-
returnmanager
400-
401-
402385
classFigureCanvasGDK (FigureCanvasBase):
403386
def__init__(self,figure):
404387
FigureCanvasBase.__init__(self,figure)
@@ -452,3 +435,9 @@ def _print_image(self, filename, format, *args, **kwargs):
452435
options['quality']=str(options['quality'])
453436

454437
pixbuf.save(filename,format,options=options)
438+
439+
440+
@_Backend.export
441+
class_BackendGDK(_Backend):
442+
FigureCanvas=FigureCanvasGDKAgg
443+
FigureManager=FigureManagerGDKAgg

‎lib/matplotlib/backends/backend_gtk.py‎

Lines changed: 19 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,14 @@
2828

2929
importmatplotlib
3030
frommatplotlib._pylab_helpersimportGcf
31-
frommatplotlib.backend_basesimportRendererBase,GraphicsContextBase, \
32-
FigureManagerBase,FigureCanvasBase,NavigationToolbar2,cursors,TimerBase
33-
frommatplotlib.backend_basesimportShowBase
31+
frommatplotlib.backend_basesimport(
32+
_Backend,FigureCanvasBase,FigureManagerBase,NavigationToolbar2,
33+
TimerBase,cursors)
3434

3535
frommatplotlib.backends.backend_gdkimportRendererGDK,FigureCanvasGDK
36-
frommatplotlib.cbookimportis_writable_file_like
36+
frommatplotlib.cbookimportis_writable_file_like,warn_deprecated
3737
frommatplotlib.figureimportFigure
3838
frommatplotlib.widgetsimportSubplotTool
39-
frommatplotlib.cbookimportwarn_deprecated
4039

4140
frommatplotlibimport (
4241
cbook,colorsasmcolors,lines,markers,rcParams,verbose)
@@ -63,41 +62,6 @@ def GTK_WIDGET_DRAWABLE(w):
6362
returnflags&gtk.VISIBLE!=0andflags&gtk.MAPPED!=0
6463

6564

66-
defdraw_if_interactive():
67-
"""
68-
Is called after every pylab drawing command
69-
"""
70-
ifmatplotlib.is_interactive():
71-
figManager=Gcf.get_active()
72-
iffigManagerisnotNone:
73-
figManager.canvas.draw_idle()
74-
75-
76-
classShow(ShowBase):
77-
defmainloop(self):
78-
ifgtk.main_level()==0:
79-
gtk.main()
80-
81-
show=Show()
82-
83-
defnew_figure_manager(num,*args,**kwargs):
84-
"""
85-
Create a new figure manager instance
86-
"""
87-
FigureClass=kwargs.pop('FigureClass',Figure)
88-
thisFig=FigureClass(*args,**kwargs)
89-
returnnew_figure_manager_given_figure(num,thisFig)
90-
91-
92-
defnew_figure_manager_given_figure(num,figure):
93-
"""
94-
Create a new figure manager instance for the given figure.
95-
"""
96-
canvas=FigureCanvasGTK(figure)
97-
manager=FigureManagerGTK(canvas,num)
98-
returnmanager
99-
100-
10165
classTimerGTK(TimerBase):
10266
'''
10367
Subclass of :class:`backend_bases.TimerBase` using GTK for timer events.
@@ -521,6 +485,7 @@ def stop_event_loop(self):
521485
FigureCanvasBase.stop_event_loop_default(self)
522486
stop_event_loop.__doc__=FigureCanvasBase.stop_event_loop_default.__doc__
523487

488+
524489
classFigureManagerGTK(FigureManagerBase):
525490
"""
526491
Attributes
@@ -866,6 +831,7 @@ def get_filename_from_user (self):
866831

867832
returnfilename,self.ext
868833

834+
869835
classDialogLineprops(object):
870836
"""
871837
A GUI dialog for controlling lineprops
@@ -1056,5 +1022,16 @@ def error_msg_gtk(msg, parent=None):
10561022
dialog.destroy()
10571023

10581024

1059-
FigureCanvas=FigureCanvasGTK
1060-
FigureManager=FigureManagerGTK
1025+
@_Backend.export
1026+
class_BackendGTK(_Backend):
1027+
FigureCanvas=FigureCanvasGTK
1028+
FigureManager=FigureManagerGTK
1029+
1030+
@staticmethod
1031+
deftrigger_manager_draw(manager):
1032+
manager.canvas.draw_idle()
1033+
1034+
@staticmethod
1035+
defmainloop():
1036+
ifgtk.main_level()==0:
1037+
gtk.main()

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp