搭配 Gtk3 的 Pylab(Sgskip)

Beginner

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

简介

在本实验中,我们将学习如何使用 Matplotlib 库来创建和修改图形窗口。我们还将探索如何通过访问底层的 GTK 小部件来自定义图形用户界面(GUI)。

虚拟机使用提示

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

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

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

导入库

首先,我们需要导入必要的库。我们将使用 Matplotlib、GTK3 以及来自 gi.repository 的 Gtk 模块。

import matplotlib
matplotlib.use('GTK3Agg')  ## 或者 'GTK3Cairo'
import gi
import matplotlib.pyplot as plt
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk

创建图形和坐标轴

接下来,我们将使用 subplots() 方法创建一个图形和坐标轴。然后,我们将在坐标轴上绘制两条线,并添加一个图例以区分它们。

fig, ax = plt.subplots()
ax.plot([1, 2, 3], 'ro-', label='easy as 1 2 3')
ax.plot([1, 4, 9], 'gs--', label='easy as 1 2 3 squared')
ax.legend()

访问工具栏和垂直框

我们将分别使用 manager.toolbarmanager.vbox 方法来访问图形画布管理器的工具栏和垂直框属性。

manager = fig.canvas.manager
toolbar = manager.toolbar
vbox = manager.vbox

向工具栏添加按钮

我们将使用 Gtk 模块向工具栏添加一个按钮。首先,我们创建一个带有标签的按钮,并将其连接到一个函数,以便在点击时打印一条消息。然后,我们创建一个工具项,设置其工具提示文本,将按钮添加到其中,并将其插入到工具栏中。

button = Gtk.Button(label='Click me')
button.show()
button.connect('clicked', lambda button: print('hi mom'))

toolitem = Gtk.ToolItem()
toolitem.show()
toolitem.set_tooltip_text('Click me for fun and profit')
toolitem.add(button)

pos = 8  ## 在此处插入工具栏的位置
toolbar.insert(toolitem, pos)

向垂直框添加标签

我们将向垂直框添加一个标签,用于在鼠标在坐标轴上拖动时显示其 x、y 坐标。首先,我们创建一个带有一些文本的标签,并将其添加到垂直框中。

label = Gtk.Label()
label.set_markup('Drag mouse over axes for position')
label.show()
vbox.pack_start(label, False, False, 0)

鼠标移动时更新标签文本

当鼠标在坐标轴上拖动时,我们将更新标签文本以显示鼠标的 x、y 坐标。我们创建一个函数来更新标签文本,并使用 mpl_connect() 方法将其连接到 motion_notify_event

def update(event):
    if event.xdata is None:
        label.set_markup('Drag mouse over axes for position')
    else:
        label.set_markup(
            f'<span color="#ef0000">x,y=({event.xdata}, {event.ydata})</span>')

fig.canvas.mpl_connect('motion_notify_event', update)

显示绘图

最后,我们使用 show() 方法显示绘图。

plt.show()

总结

在本实验中,我们学习了如何使用 Matplotlib 来创建和修改图形窗口。我们还探索了如何通过访问底层的 GTK 小部件来自定义图形用户界面(GUI)。我们向工具栏添加了一个按钮,向垂直框(vbox)添加了一个标签,并在鼠标移动时更新标签文本。我们还在坐标轴上绘制了两条线,并添加了一个图例来区分它们。