使用 matplotlib 和 PyGObject 在 GUI 上显示绘图

Display plot on GUI using matplotlib and PyGObject

我已经使用 Glade 和 PyGObject 构建了一个应用程序。现在,我正尝试在我的 GUI 中包含一个部分,它可以根据某些选择显示图表。经过一些研究,我发现我可以包含使用 matplotlib 生成的图,如本例所示:https://github.com/tobias47n9e/GTK3-Matplotlib-Cookbook/blob/master/examples/matplotlibwindow.py

我试过这个例子,效果很好。按照代码,我使用以下行添加了一个滚动的 window( 到主 window 中的网格:

self.scrolledwin = self.builder.get_object("scrolledwin")

生成了一个绘图并使用代码中的相同行将其设置为滚动 window:

def set_charts(self):

    fig = Figure(figsize=(5,5), dpi=100)
    ax = fig.add_subplot(111, projection='polar')

    N = 20
    theta = linspace(0.0, 2 * pi, N, endpoint=False)
    radii = 10 * random.rand(N)
    width = pi / 4 * random.rand(N)

    bars = ax.bar(theta, radii, width=width, bottom=0.0)

    for r, bar in zip(radii, bars):
        bar.set_facecolor(cm.jet(r / 10.))
        bar.set_alpha(0.5)

    ax.plot()

    canvas = FigureCanvas(fig)
    canvas.set_size_request(400,400)
    self.scrolledwin.add_with_viewport(canvas)

但是,在我的应用程序中,滚动的 window 部分是空白的,不显示情节。

我该如何解决这个问题?另外,用 "matplotlib.pyplot.savefig" 保存绘图然后显示图像会影响性能吗?

您的 set_charts 方法中似乎缺少 self.canvas.show()self.scrolledwin.show()。每次向 gui 添加内容时,都必须调用其容器小部件的 show 方法或 show_all 方法。

在您链接的示例中,所有小部件都添加到同一级别(脚本级别)并调用 my_first_window.show_all() 以在末尾显示 window 及其所有子项。

由于您要在方法中添加 self.scroledwinself.canvas 小部件(我假设,在您调用 self.your_main_window.show_all() 之后,可能在 __init__ 方法)您需要 show 那些添加的小部件才能显示它们。

来源:Gtk.Widget - gtk-widget-show