2016-08-04 22 views
1

系統使用:Windows 7的 蟒蛇:2.7.12 格萊德:3.14.2使用 庫:matplotlib,networkx上高興/ GTK3 scrolledwindow嵌入Matplotlib不顯示maplotlib的

你好, 我想顯示在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() 

figure1.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 

scrolledwindow的格萊德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> 

我有什麼作爲顯示器:

enter image description here

如果我使用按鈕「保存」工具欄上的,其實我有右圖: enter image description here

在GTK,我無法看到它。 任何人都可以幫助我嗎?

謝謝! Mia

+0

最後,我設法找出解決方案,你應該添加「self.mainWindow.show_all()」,它的工作原理。 –

回答

0

我設法找出我自己的。你應該只添加self.mainWindow.show_all()並且工作。

還有一些額外的資源來解決這個問題。

爲了嵌入到GTK GUI的matplotlib圖片,我使用下面這樣的代碼:

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 
 

 
from gi.repository import Gtk 
 

 
from matplotlib.figure import Figure 
 
from numpy import sin, cos, pi, linspace 
 
#Possibly this rendering backend is broken currently 
 
#from matplotlib.backends.backend_gtk3agg import FigureCanvasGTK3Agg as FigureCanvas 
 
from matplotlib.backends.backend_gtk3cairo import FigureCanvasGTK3Cairo as FigureCanvas from matplotlib.backends.backend_gtk3 import NavigationToolbar2GTK3 as NavigationToolbar 
 

 
class Signals: 
 
    def on_window1_destroy(self, widget): 
 
     Gtk.main_quit() 
 

 
builder = Gtk.Builder() 
 
builder.add_objects_from_file('mpl-ntb-glade.glade', ('window1', '')) 
 
builder.connect_signals(Signals()) 
 

 
myfirstwindow = builder.get_object('window1') 
 
sw = builder.get_object('scrolledwindow1') 
 
sw2 = builder.get_object('scrolledwindow2') 
 

 
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)) 
 

 
fig.tight_layout() 
 

 
canvas = FigureCanvas(fig) 
 
sw.add_with_viewport(canvas) 
 

 
toolbar = NavigationToolbar(canvas, myfirstwindow) 
 
sw2.add_with_viewport(toolbar) 
 

 
myfirstwindow.show_all() 
 
Gtk.main()

這個文檔是幫助你解決問題非常有用=)

http://gtk3-matplotlib-cookbook.readthedocs.io/en/latest/matplotlib-toolbar.html#matplotlib-toolbar-with-glade