{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\n# GTK3 spreadsheet\n\nExample of embedding Matplotlib in an application and interacting with a\ntreeview to store data. Double-click on an entry to update plot data.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import gi\n\ngi.require_version('Gtk', '3.0')\ngi.require_version('Gdk', '3.0')\nfrom gi.repository import Gdk, Gtk\n\nfrom numpy.random import random\n\nfrom matplotlib.backends.backend_gtk3agg import FigureCanvas # or gtk3cairo.\nfrom matplotlib.figure import Figure\n\n\nclass DataManager(Gtk.Window):\n num_rows, num_cols = 20, 10\n\n data = random((num_rows, num_cols))\n\n def __init__(self):\n super().__init__()\n self.set_default_size(600, 600)\n self.connect('destroy', lambda win: Gtk.main_quit())\n\n self.set_title('GtkListStore demo')\n self.set_border_width(8)\n\n vbox = Gtk.VBox(homogeneous=False, spacing=8)\n self.add(vbox)\n\n label = Gtk.Label(label='Double click a row to plot the data')\n\n vbox.pack_start(label, False, False, 0)\n\n sw = Gtk.ScrolledWindow()\n sw.set_shadow_type(Gtk.ShadowType.ETCHED_IN)\n sw.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC)\n vbox.pack_start(sw, True, True, 0)\n\n model = self.create_model()\n\n self.treeview = Gtk.TreeView(model=model)\n\n # Matplotlib stuff\n fig = Figure(figsize=(6, 4))\n\n self.canvas = FigureCanvas(fig) # a Gtk.DrawingArea\n vbox.pack_start(self.canvas, True, True, 0)\n ax = fig.add_subplot()\n self.line, = ax.plot(self.data[0, :], 'go') # plot the first row\n\n self.treeview.connect('row-activated', self.plot_row)\n sw.add(self.treeview)\n\n self.add_columns()\n\n self.add_events(Gdk.EventMask.BUTTON_PRESS_MASK |\n Gdk.EventMask.KEY_PRESS_MASK |\n Gdk.EventMask.KEY_RELEASE_MASK)\n\n def plot_row(self, treeview, path, view_column):\n ind, = path # get the index into data\n points = self.data[ind, :]\n self.line.set_ydata(points)\n self.canvas.draw()\n\n def add_columns(self):\n for i in range(self.num_cols):\n column = Gtk.TreeViewColumn(str(i), Gtk.CellRendererText(), text=i)\n self.treeview.append_column(column)\n\n def create_model(self):\n types = [float] * self.num_cols\n store = Gtk.ListStore(*types)\n for row in self.data:\n store.append(tuple(row))\n return store\n\n\nmanager = DataManager()\nmanager.show_all()\nGtk.main()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.13.2" } }, "nbformat": 4, "nbformat_minor": 0 }