Question

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

Was it helpful?

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>
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top