Search code examples
python-3.xmatplotlibgtk3glade

Matplotlib as Glade/GTK widget: porting to new version


I found this tutorial for displaying a matplotlib-plot inside of a glade/GTK-window:

http://matplotlib.org/examples/user_interfaces/mpl_with_glade.html

I am not sure which version of the many packages this tutorial uses. How can I port this code to the newest versions of GTK and Glade?

The Glade file can be found here:

https://github.com/matplotlib/matplotlib/blob/master/examples/user_interfaces/mpl_with_glade.glade


Solution

  • I got a simple version to work. Feel free to post improvements. I also posted a pull request so this might get added to the matplotlib documentation.

    Python 3 file:

        #!/usr/bin/env python3
    
        from gi.repository import Gtk, Gio
    
        from matplotlib.figure import Figure
        from matplotlib.axes import Subplot
        from numpy import arange, sin, pi
        from matplotlib.backends.backend_gtk3agg import FigureCanvasGTK3Agg as FigureCanvas
    
        import sys
    
        class Window1Signals:
            def on_window1_destroy(self, widget):
                Gtk.main_quit()
    
        def main():
            builder = Gtk.Builder()
            builder.add_objects_from_file("mpl_with_glade_316.glade", ("window1", "") )
            builder.connect_signals(Window1Signals())
            window = builder.get_object("window1")
            sw = builder.get_object("scrolledwindow1")
    
            #Start of Matplotlib specific code
            ##########################################################################
            figure = Figure(figsize=(8,6), dpi=71)
            axis = figure.add_subplot(111)
            t = arange(0.0, 3.0, 0.01)
            s = sin(2*pi*t)
            axis.plot(t,s)
    
            axis.set_xlabel('time [s]')
            axis.set_ylabel('voltage [V]')
    
            canvas = FigureCanvas(figure)  # a Gtk.DrawingArea
            canvas.set_size_request(800,600)
            sw.add_with_viewport(canvas)    
            ##########################################################################
            #End of Matplotlib specific code    
    
            window.show_all()
            Gtk.main()
    
        if __name__ == "__main__":
            main()
    

    Glade code:

        <?xml version="1.0" encoding="UTF-8"?>
        <!-- Generated with glade 3.16.1 -->
        <interface>
          <requires lib="gtk+" version="3.10"/>
          <object class="GtkApplicationWindow" id="window1">
            <property name="can_focus">False</property>
            <property name="title" translatable="yes">Matplotlib</property>
            <property name="default_width">800</property>
            <property name="default_height">600</property>
            <signal name="destroy" handler="on_window1_destroy" swapped="no"/>
            <child>
              <object class="GtkScrolledWindow" id="scrolledwindow1">
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="border_width">10</property>
                <property name="shadow_type">in</property>
                <child>
                  <placeholder/>
                </child>
              </object>
            </child>
          </object>
        </interface>