在Glad/GTK3滚动窗口上嵌入Matplotlib不会显示maplotlib';s

在Glad/GTK3滚动窗口上嵌入Matplotlib不会显示maplotlib';s,matplotlib,gtk3,glade,python-embedding,Matplotlib,Gtk3,Glade,Python Embedding,使用的系统:Windows 7 python:2.7.12 林间空地:3.14.2 使用的库:matplotlib、networkx 你好,, 我试图在GTK上显示嵌入matplotlib的图形。滚动窗口上的显示不起作用。然而,当我试图用工具栏保存它时,我实际上可以保存它 代码如下: import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk from figure1 import figure from ma

使用的系统:Windows 7 python:2.7.12 林间空地:3.14.2 使用的库:matplotlib、networkx

你好,, 我试图在GTK上显示嵌入matplotlib的图形。滚动窗口上的显示不起作用。然而,当我试图用工具栏保存它时,我实际上可以保存它

代码如下:

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
from figure1 import figure
from matplotlib.figure import Figure
from matplotlib.backends.backend_gtk3cairo import FigureCanvasGTK3Cairo as          FigureCanvas
from matplotlib.backends.backend_gtk3 import NavigationToolbar2GTK3 as NavigationToolbar

class main_function():

def __init__(self):
    interface= Gtk.Builder()
    interface.add_from_file("interface1.glade")   
    interface.connect_signals(self)
          # relier les signaux aux fonctions        
    # on stocke notre fichier Glade dans des variables
    self.mainWindow=interface.get_object("mainWindow")
    self.aboutchronomap=interface.get_object("aboutchronomap")
    self.fichierdialogue=interface.get_object("fichierdialogue")
    self.sw=interface.get_object("mainFigure")
    self.sw2=interface.get_object("MatplotlibToolbar")
   # on stocke les widgets avec les interfaces
    canvas = FigureCanvas(figure())
    print(type(canvas))
    print(type(figure()))
    self.sw.add_with_viewport(canvas)
    print("self.sw.add_with_viewport(canvas)")        
    toolbar = NavigationToolbar(canvas, self.mainWindow)
    self.sw2.add_with_viewport(toolbar)   
    print("toolbar display")


main_function()
Gtk.main() 
图1.py代码:

from gi.repository import Gtk
import matplotlib.pyplot as plt
from matplotlib.figure import Figure
from numpy import sin, cos, pi, linspace


def figure():
    fig = Figure(figsize=(5,5), dpi=80)
    ax = fig.add_subplot(111)

    n = 1000
    xsin = linspace(-pi, pi, n, endpoint=True)
    xcos = linspace(-pi, pi, n, endpoint=True)
    ysin = sin(xsin)
    ycos = cos(xcos)

    sinwave = ax.plot(xsin, ysin, color='black', label='sin(x)')
    coswave = ax.plot(xcos, ycos, color='black', label='cos(x)', linestyle='--')

    ax.set_xlim(-pi,pi)
    ax.set_ylim(-1.2,1.2)

    ax.fill_between(xsin, 0, ysin, (ysin - 1) > -1, color='blue', alpha=.3)
    ax.fill_between(xsin, 0, ysin, (ysin - 1) < -1, color='red',  alpha=.3)
    ax.fill_between(xcos, 0, ycos, (ycos - 1) > -1, color='blue', alpha=.3)
    ax.fill_between(xcos, 0, ycos, (ycos - 1) < -1, color='red',  alpha=.3)

    ax.legend(loc='upper left')

    ax = fig.gca()
    ax.spines['right'].set_color('none')
    ax.spines['top'].set_color('none')
    ax.xaxis.set_ticks_position('bottom')
    ax.spines['bottom'].set_position(('data',0))
    ax.yaxis.set_ticks_position('left')
    ax.spines['left'].set_position(('data',0))
    return fig
从gi.repository导入Gtk
将matplotlib.pyplot作为plt导入
从matplotlib.figure导入图形
从numpy导入sin、cos、pi、linspace
def figure():
图=图(图尺寸=(5,5),dpi=80)
ax=图添加_子批次(111)
n=1000
xsin=linspace(-pi,pi,n,endpoint=True)
xcos=linspace(-pi,pi,n,endpoint=True)
ysin=sin(xsin)
ycos=cos(xcos)
sinwave=ax.plot(xsin,ysin,color='black',label='sin(x)'
coswave=ax.plot(xcos,ycos,color='black',label='cos(x'),linestyle=''--')
ax.set_xlim(-pi,pi)
ax.set_ylim(-1.2,1.2)
ax.fill_介于(xsin,0,ysin,(ysin-1)>-1,color='blue',alpha=.3)之间
在(xsin,0,ysin,(ysin-1)<-1,color='red',alpha=.3)之间的最大填充
(xcos,0,ycos,(ycos-1)>-1,color='blue',alpha=.3)之间的最大填充
(xcos,0,ycos,(ycos-1)<-1,color='red',alpha=.3)之间的最大填充
ax.图例(位置='左上')
ax=图gca()
斧头刺['right'].设置颜色('none')
斧头刺['top'].设置颜色(“无”)
ax.xaxis.set\u ticks\u位置('底部')
ax.spines['bottom'].设置_位置(('data',0))
ax.yaxis.set\u ticks\u位置(“左”)
ax.spines['left'].设置_位置(('data',0))
返回图
图通常显示的滚动窗口的Glade xml代码:

<child>
                  <object class="GtkScrolledWindow" id="mainFigure">
                    <property name="visible">True</property>
                    <property name="can_focus">True</property>
                    <property name="hscrollbar_policy">always</property>
                    <property name="vscrollbar_policy">always</property>
                    <property name="shadow_type">in</property>
                    <child>
                      <placeholder/>
                    </child>
                  </object>
                  <packing>
                    <property name="expand">True</property>
                    <property name="fill">True</property>
                    <property name="position">1</property>
                  </packing>
</child>

真的
真的
总是
总是
在里面
真的
真的
1.
我所展示的:

如果我使用工具栏上的“保存”按钮,我实际上得到了正确的图形:

在GTK上,我看不到它。 有人能帮我吗

谢谢大家!!
米娅

我自己设法弄明白了。您只需添加self.mainWindow.show_all()即可

这个问题还有一些额外的原因

为了将matplotlib图片嵌入GTK GUI,我使用以下代码:

    def on_carto_display_button_press_event(self,widget,event):
    if self.View.display_Mode != "carto":
        self.View.display_Mode = "carto"
        child=self.View.sw.get_child()
        child1 = self.View.toolbar.get_child()
        #print(child1)

        if child != None:
            self.View.toolbar.remove(child1)
            self.View.sw.remove(child)
            self.box.remove(self.View.canvasChrono)

        self.box=Gtk.Box()
        self.View.sw.add(self.box)
        self.box.pack_start(self.View.canvasCarto, True, True, 0)
        #Add toolbar
        toolbar = NavigationToolbar(self.View.canvasCarto, self.View.window)
        self.View.toolbar.add_with_viewport(toolbar)
        child1 = self.View.toolbar.get_child()
        #print(child1)
        self.View.sw.show_all()
        #self.View.toolbar.show_all()
在GUi GTK中嵌入matplotlib绘图的另一个示例如下:

#/usr/bin/python3
从gi.repository导入Gtk
从matplotlib.figure导入图形
从numpy导入sin、cos、pi、linspace
#此渲染后端当前可能已损坏
#从matplotlib.backends.backendgtk3agg导入FigureCanvasGTK3Agg作为FigureCanvas
从matplotlib.backends.backends\U gtk3cairo导入Figure从matplotlib.backends.backends\U gtk3导入导航工具栏2GTK3作为导航工具栏
等级信号:
窗口1上的def销毁(自我,小部件):
Gtk.main_quit()
builder=Gtk.builder()
从文件('mpl-ntb-glade.glade',('window1','')中添加对象
builder.connect_信号(signals())
myfirstwindow=builder.get\u对象('window1')
sw=builder.get_对象('scrolledwindow1')
sw2=builder.get_对象('scrolledwindow2')
图=图(图尺寸=(5,5),dpi=80)
ax=图添加_子批次(111)
n=1000
xsin=linspace(-pi,pi,n,endpoint=True)
xcos=linspace(-pi,pi,n,endpoint=True)
ysin=sin(xsin)
ycos=cos(xcos)
sinwave=ax.plot(xsin,ysin,color='black',label='sin(x)'
coswave=ax.plot(xcos,ycos,color='black',label='cos(x'),linestyle=''--')
ax.set_xlim(-pi,pi)
ax.set_ylim(-1.2,1.2)
ax.fill_介于(xsin,0,ysin,(ysin-1)>-1,color='blue',alpha=.3)之间
在(xsin,0,ysin,(ysin-1)<-1,color='red',alpha=.3)之间的最大填充
(xcos,0,ycos,(ycos-1)>-1,color='blue',alpha=.3)之间的最大填充
(xcos,0,ycos,(ycos-1)<-1,color='red',alpha=.3)之间的最大填充
ax.图例(位置='左上')
ax=图gca()
斧头刺['right'].设置颜色('none')
斧头刺['top'].设置颜色(“无”)
ax.xaxis.set\u ticks\u位置('底部')
ax.spines['bottom'].设置_位置(('data',0))
ax.yaxis.set\u ticks\u位置(“左”)
ax.spines['left'].设置_位置(('data',0))
图1紧_布局图()
画布=图画布(图)
sw.添加带有视口的视口(画布)
工具栏=导航工具栏(画布,myfirstwindow)
sw2.使用_视口添加_(工具栏)
myfirstwindow.show_all()

Gtk.main()
我自己设法弄明白了。您只需添加self.mainWindow.show_all()即可

这个问题还有一些额外的原因

为了将matplotlib图片嵌入GTK GUI,我使用以下代码:

    def on_carto_display_button_press_event(self,widget,event):
    if self.View.display_Mode != "carto":
        self.View.display_Mode = "carto"
        child=self.View.sw.get_child()
        child1 = self.View.toolbar.get_child()
        #print(child1)

        if child != None:
            self.View.toolbar.remove(child1)
            self.View.sw.remove(child)
            self.box.remove(self.View.canvasChrono)

        self.box=Gtk.Box()
        self.View.sw.add(self.box)
        self.box.pack_start(self.View.canvasCarto, True, True, 0)
        #Add toolbar
        toolbar = NavigationToolbar(self.View.canvasCarto, self.View.window)
        self.View.toolbar.add_with_viewport(toolbar)
        child1 = self.View.toolbar.get_child()
        #print(child1)
        self.View.sw.show_all()
        #self.View.toolbar.show_all()
在GUi GTK中嵌入matplotlib绘图的另一个示例如下:

#/usr/bin/python3
从gi.repository导入Gtk
从matplotlib.figure导入图形
从numpy导入sin、cos、pi、linspace
#此渲染后端当前可能已损坏
#从matplotlib.backends.backendgtk3agg导入FigureCanvasGTK3Agg作为FigureCanvas
从matplotlib.backends.backends\U gtk3cairo导入Figure从matplotlib.backends.backends\U gtk3导入导航工具栏2GTK3作为导航工具栏
等级信号:
窗口1上的def销毁(自我,小部件):
Gtk.main_quit()
builder=Gtk.builder()
从文件('mpl-ntb-glade.glade',('window1','')中添加对象
builder.connect_信号(signals())
myfirstwindow=builder.get\u对象('window1')
sw=builder.get_对象('scrolledwindow1')
sw2=builder.get_对象('scrolledwindow2')
图=图(图尺寸=(5,5),dpi=80)
ax=图添加_子批次(111)
n=1000
xsin=linspace(-pi,pi,n,endpoint=True)
xcos=linspace(-pi,pi,n,endpoint=True)
ysin=sin(xsin)
ycos=cos(xcos)
sinwave=ax.plot(xsin,ysin,color='black',label='sin(x)'
coswave=ax.plot(xcos,ycos,color='black',label='co