Gtk3 电子表格 Sgskip

Beginner

This tutorial is from open-source community. Access the source code

简介

Matplotlib 是一个广受欢迎的 Python 库,用于在 Python 中创建静态、动画和交互式可视化。在本实验中,你将学习如何将 Matplotlib 嵌入到 GTK3 应用程序中,并与树状视图进行交互以存储数据。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签页,以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,请随时向 Labby 提问。课程结束后提供反馈,我们将立即为你解决问题。

设置环境

在开始之前,我们需要设置我们的环境。我们将首先创建一个新的 Python 文件并导入必要的库。

import gi
gi.require_version('Gtk', '3.0')
gi.require_version('Gdk', '3.0')
from gi.repository import Gdk, Gtk
from numpy.random import random
from matplotlib.backends.backend_gtk3agg import FigureCanvas
from matplotlib.figure import Figure

创建数据管理器窗口

在这一步中,我们将创建一个继承自 Gtk.Window 类的 DataManager 类。这个类将负责管理我们想要绘制的数据。

class DataManager(Gtk.Window):
    num_rows, num_cols = 20, 10
    data = random((num_rows, num_cols))

设置窗口

在这一步中,我们将设置用于显示数据的窗口。我们首先用一个标题和一个大小来初始化窗口。

def __init__(self):
    super().__init__()
    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(homogeneous=False, spacing=8)
self.add(vbox)
label = Gtk.Label(label='Double click a row to plot the data')
vbox.pack_start(label, False, False, 0)

添加一个 TreeView

在这一步中,我们将向窗口添加一个 TreeView 来显示我们的数据。我们还将创建一个模型来存储数据。

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=model)
self.treeview.connect('row-activated', self.plot_row)
sw.add(self.treeview)
self.add_columns()

创建 Matplotlib 绘图

在这一步中,我们将创建一个 Matplotlib 绘图来显示我们的数据。我们首先创建一个图形并添加一个子图。

fig = Figure(figsize=(6, 4))
self.canvas = FigureCanvas(fig)
vbox.pack_start(self.canvas, True, True, 0)
ax = fig.add_subplot()

绘制数据

在这一步中,我们将在 Matplotlib 绘图上绘制数据的第一行。

self.line, = ax.plot(self.data[0, :], 'go')

实现绘图功能

在这一步中,我们将实现双击某一行时绘制数据的功能。

def plot_row(self, treeview, path, view_column):
    ind, = path
    points = self.data[ind, :]
    self.line.set_ydata(points)
    self.canvas.draw()

向 TreeView 添加列

在这一步中,我们将向 TreeView 添加列,用于显示我们的数据。

def add_columns(self):
    for i in range(self.num_cols):
        column = Gtk.TreeViewColumn(str(i), Gtk.CellRendererText(), text=i)
        self.treeview.append_column(column)

创建模型

在这一步中,我们将创建用于存储数据的模型。

def create_model(self):
    types = [float] * self.num_cols
    store = Gtk.ListStore(*types)
    for row in self.data:
        store.append(tuple(row))
    return store

显示窗口

在这一步中,我们将显示用于展示数据的窗口。

manager = DataManager()
manager.show_all()
Gtk.main()

总结

在本次实验中,你学习了如何将 Matplotlib 嵌入到 GTK3 应用程序中,并与 TreeView 进行交互以存储数据。你还学习了如何使用 Matplotlib 绘制数据,以及如何创建一个模型来在 TreeView 中存储数据。