GTK电子表格
在应用程序中嵌入matplotlib并与treeview交互以存储数据的示例。双击条目以更新绘图数据。
import gigi.require_version('Gtk', '3.0')gi.require_version('Gdk', '3.0')from gi.repository import Gtk, Gdkfrom matplotlib.backends.backend_gtk3agg import FigureCanvas# from matplotlib.backends.backend_gtk3cairo import FigureCanvasfrom numpy.random import randomfrom matplotlib.figure import Figureclass DataManager(Gtk.Window):numRows, numCols = 20, 10data = random((numRows, numCols))def __init__(self):Gtk.Window.__init__(self)self.set_default_size(600, 600)self.connect('destroy', lambda win: Gtk.main_quit())self.set_title('GtkListStore demo')self.set_border_width(8)vbox = Gtk.VBox(False, 8)self.add(vbox)label = Gtk.Label('Double click a row to plot the data')vbox.pack_start(label, False, False, 0)sw = Gtk.ScrolledWindow()sw.set_shadow_type(Gtk.ShadowType.ETCHED_IN)sw.set_policy(Gtk.PolicyType.NEVER,Gtk.PolicyType.AUTOMATIC)vbox.pack_start(sw, True, True, 0)model = self.create_model()self.treeview = Gtk.TreeView(model)self.treeview.set_rules_hint(True)# matplotlib stufffig = Figure(figsize=(6, 4))self.canvas = FigureCanvas(fig) # a Gtk.DrawingAreavbox.pack_start(self.canvas, True, True, 0)ax = fig.add_subplot(111)self.line, = ax.plot(self.data[0, :], 'go') # plot the first rowself.treeview.connect('row-activated', self.plot_row)sw.add(self.treeview)self.add_columns()self.add_events(Gdk.EventMask.BUTTON_PRESS_MASK |Gdk.EventMask.KEY_PRESS_MASK |Gdk.EventMask.KEY_RELEASE_MASK)def plot_row(self, treeview, path, view_column):ind, = path # get the index into datapoints = self.data[ind, :]self.line.set_ydata(points)self.canvas.draw()def add_columns(self):for i in range(self.numCols):column = Gtk.TreeViewColumn(str(i), Gtk.CellRendererText(), text=i)self.treeview.append_column(column)def create_model(self):types = [float]*self.numColsstore = Gtk.ListStore(*types)for row in self.data:store.append(tuple(row))return storemanager = DataManager()manager.show_all()Gtk.main()
