使用matplotlib和PyGObject在GUI上显示图

时间:2018-09-05 08:40:01

标签: matplotlib gtk3 pygobject

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

我尝试了该示例,并且工作正常。在代码之后,我使用以下行添加了一个滚动窗口(添加到主窗口中的网格):

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

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

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)

但是,在我的应用程序中,滚动窗口部分为空白,并且不显示绘图。

我该如何解决?另外,是否会使用“ matplotlib.pyplot.savefig”保存绘图,然后显示图像会影响性能?

1 个答案:

答案 0 :(得分:0)

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

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

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

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