1"""
2=====================
3Matplotlib With Glade
4=====================
5
6"""
7from __future__ import print_function
8import matplotlib
9matplotlib.use('GTK')
10
11from matplotlib.figure import Figure
12from matplotlib.axes import Subplot
13from matplotlib.backends.backend_gtkagg import FigureCanvasGTKAgg as FigureCanvas
14from matplotlib.backends.backend_gtkagg import NavigationToolbar2GTKAgg as NavigationToolbar
15from matplotlib.widgets import SpanSelector
16
17import numpy as np
18import gtk
19import gtk.glade
20
21
22def simple_msg(msg, parent=None, title=None):
23    dialog = gtk.MessageDialog(
24        parent=None,
25        type=gtk.MESSAGE_INFO,
26        buttons=gtk.BUTTONS_OK,
27        message_format=msg)
28    if parent is not None:
29        dialog.set_transient_for(parent)
30    if title is not None:
31        dialog.set_title(title)
32    dialog.show()
33    dialog.run()
34    dialog.destroy()
35    return None
36
37
38class GladeHandlers(object):
39    def on_buttonClickMe_clicked(event):
40        simple_msg('Nothing to say, really',
41                   parent=widgets['windowMain'],
42                   title='Thanks!')
43
44
45class WidgetsWrapper(object):
46    def __init__(self):
47        self.widgets = gtk.glade.XML('mpl_with_glade.glade')
48        self.widgets.signal_autoconnect(GladeHandlers.__dict__)
49
50        self['windowMain'].connect('destroy', lambda x: gtk.main_quit())
51        self['windowMain'].move(10, 10)
52        self.figure = Figure(figsize=(8, 6), dpi=72)
53        self.axis = self.figure.add_subplot(111)
54
55        t = np.arange(0.0, 3.0, 0.01)
56        s = np.sin(2*np.pi*t)
57        self.axis.plot(t, s)
58        self.axis.set_xlabel('time (s)')
59        self.axis.set_ylabel('voltage')
60
61        self.canvas = FigureCanvas(self.figure)  # a gtk.DrawingArea
62        self.canvas.show()
63        self.canvas.set_size_request(600, 400)
64        self.canvas.set_events(
65            gtk.gdk.BUTTON_PRESS_MASK |
66            gtk.gdk.KEY_PRESS_MASK |
67            gtk.gdk.KEY_RELEASE_MASK
68            )
69        self.canvas.set_flags(gtk.HAS_FOCUS | gtk.CAN_FOCUS)
70        self.canvas.grab_focus()
71
72        def keypress(widget, event):
73            print('key press')
74
75        def buttonpress(widget, event):
76            print('button press')
77
78        self.canvas.connect('key_press_event', keypress)
79        self.canvas.connect('button_press_event', buttonpress)
80
81        def onselect(xmin, xmax):
82            print(xmin, xmax)
83
84        span = SpanSelector(self.axis, onselect, 'horizontal', useblit=False,
85                            rectprops=dict(alpha=0.5, facecolor='red'))
86
87        self['vboxMain'].pack_start(self.canvas, True, True)
88        self['vboxMain'].show()
89
90        # below is optional if you want the navigation toolbar
91        self.navToolbar = NavigationToolbar(self.canvas, self['windowMain'])
92        self.navToolbar.lastDir = '/var/tmp/'
93        self['vboxMain'].pack_start(self.navToolbar)
94        self.navToolbar.show()
95
96        sep = gtk.HSeparator()
97        sep.show()
98        self['vboxMain'].pack_start(sep, True, True)
99
100        self['vboxMain'].reorder_child(self['buttonClickMe'], -1)
101
102    def __getitem__(self, key):
103        return self.widgets.get_widget(key)
104
105widgets = WidgetsWrapper()
106gtk.main()
107