1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
| import gi gi.require_version('Gtk', '3.0') gi.require_version('Gdk', '3.0') from gi.repository import Gtk, Gdk
from matplotlib.backends.backend_gtk3agg import FigureCanvas
from numpy.random import random from matplotlib.figure import Figure
class DataManager(Gtk.Window): numRows, numCols = 20, 10
data = 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)
fig = Figure(figsize=(6, 4))
self.canvas = FigureCanvas(fig) vbox.pack_start(self.canvas, True, True, 0) ax = fig.add_subplot(111) self.line, = ax.plot(self.data[0, :], 'go')
self.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 points = 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.numCols store = Gtk.ListStore(*types)
for row in self.data: store.append(tuple(row)) return store
manager = DataManager() manager.show_all() Gtk.main()
|