1
+ from matplotlib .backend_bases import NavigationToolbar2
2
+ from kivy .properties import ObjectProperty
3
+ from kivy .lang import Builder
4
+ from kivy .uix .boxlayout import BoxLayout
5
+
6
+ class MatplotNavToolbar (BoxLayout ):
7
+
8
+ """Figure Toolbar"""
9
+ pan_btn = ObjectProperty (None )
10
+ zoom_btn = ObjectProperty (None )
11
+ home_btn = ObjectProperty (None )
12
+ back_btn = ObjectProperty (None )
13
+ forward_btn = ObjectProperty (None )
14
+ info_lbl = ObjectProperty (None )
15
+ _navtoolbar = None # Internal NavToolbar logic
16
+ figure_widget = ObjectProperty (None )
17
+
18
+ def __init__ (self , figure_widget = None , * args , ** kwargs ):
19
+ super (MatplotNavToolbar , self ).__init__ (* args , ** kwargs )
20
+ self .figure_widget = figure_widget
21
+
22
+ def on_figure_widget (self , obj , value ):
23
+ self .figure_widget .bind (figcanvas = self ._canvas_ready )
24
+
25
+ def _canvas_ready (self , obj , value ):
26
+ self ._navtoolbar = _NavigationToolbar (value , self )
27
+ self ._navtoolbar .figure_widget = obj
28
+
29
+
30
+ class _NavigationToolbar (NavigationToolbar2 ):
31
+ figure_widget = None
32
+
33
+ def __init__ (self , canvas , widget ):
34
+ self .widget = widget
35
+ super (_NavigationToolbar , self ).__init__ (canvas )
36
+
37
+ def _init_toolbar (self ):
38
+ print ('init toolbar' )
39
+ self .widget .home_btn .bind (on_press = self .home )
40
+ self .widget .pan_btn .bind (on_press = self .pan )
41
+ self .widget .zoom_btn .bind (on_press = self .zoom )
42
+ self .widget .back_btn .bind (on_press = self .back )
43
+ self .widget .forward_btn .bind (on_press = self .forward )
44
+
45
+ def dynamic_update (self ):
46
+ self .canvas .draw ()
47
+
48
+ def draw_rubberband (self , event , x0 , y0 , x1 , y1 ):
49
+ self .figure_widget .draw_box (event , x0 , y0 , x1 , y1 )
50
+
51
+ def set_message (self , s ):
52
+ self .widget .info_lbl .text = s
53
+
54
+ from kivy .factory import Factory
55
+ Factory .register ('MatplotNavToolbar' , MatplotNavToolbar )
56
+
57
+ Builder .load_string ('''
58
+ <MatplotNavToolbar>:
59
+ orientation: 'vertical'
60
+ home_btn: home_btn
61
+ pan_btn: pan_btn
62
+ zoom_btn: zoom_btn
63
+ info_lbl: info_lbl
64
+ back_btn: back_btn
65
+ forward_btn: forward_btn
66
+ Label:
67
+ id: info_lbl
68
+ size_hint: 1, 0.3
69
+ BoxLayout:
70
+ size_hint: 1, 0.7
71
+ Button:
72
+ id: home_btn
73
+ text: "Home"
74
+ Button:
75
+ id: back_btn
76
+ text: "Back"
77
+ Button:
78
+ id: forward_btn
79
+ text: "Forward"
80
+ ToggleButton:
81
+ id: pan_btn
82
+ text: "Pan"
83
+ group: "toolbar_btn"
84
+ ToggleButton:
85
+ id: zoom_btn
86
+ text: "Zoom"
87
+ group: "toolbar_btn"
88
+
89
+ ''' )
0 commit comments