Matplotlib作为Glade / GTK小部件:移植到新版本

时间:2014-04-08 16:31:13

标签: python-3.x matplotlib gtk3 glade

我发现本教程用于在glade / GTK窗口中显示matplotlib-plot:

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

我不确定本教程使用的许多软件包的版本。如何将此代码移植到最新版本的GTK和Glade?

可以在这里找到Glade文件:

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

1 个答案:

答案 0 :(得分:0)

我有一个简单的版本可以使用。随意发布改进。我还发布了拉取请求,因此可能会将其添加到matplotlib文档中。

Python 3文件:

    #!/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代码:

    <?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>