在 Glad/GTK3 scrolledwindow 上嵌入 Matplotlib 不显示 maplotlib 的
embedding Matplotlib on Glad/GTK3 scrolledwindow does not display maplotlib's
使用的系统: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()
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
Glade xml scrolledwindow 代码应该正常显示的地方:
<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>
我展示的内容:
如果我使用工具栏上的按钮 "save",我实际上得到了正确的数字:
在 GTK 上,我看不到它。
谁能帮帮我?
谢谢!
米娅
我自己想办法。您应该只添加 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()
此文档对帮助您解决问题非常有用 =)
使用的系统: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()
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
Glade xml scrolledwindow 代码应该正常显示的地方:
<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>
我展示的内容:
如果我使用工具栏上的按钮 "save",我实际上得到了正确的数字:
在 GTK 上,我看不到它。 谁能帮帮我?
谢谢! 米娅
我自己想办法。您应该只添加 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()
此文档对帮助您解决问题非常有用 =)