使Matplotlib和GTK3在python3窗口上运行

时间:2016-07-20 07:37:33

标签: python matplotlib networkx gtk3 cairo

我正在尝试让GTK3和Python3在windows下工作到我的项目中。

我有一个连续的anaconda设置,带有32位python 3.4和Matplotib via conda install matplotlib。

我安装了PyGobject(https://sourceforge.net/projects/pygobjectwin32/)并通过安装程序安装了GTK + / Glade。

GTK3教程的基本例子效果很好(空屏幕)

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk

win = Gtk.Window()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()

我现在想在gtk中嵌入matplotlib,我从matplotlib(http://matplotlib.org/examples/user_interfaces/embedding_in_gtk3.html)获得了示例

然后我看到我需要cairocffi,因为有些不可能。 (PyCairo不支持matplotlib函数)

我从Gohlke获得了cffi的windows二进制文件

并且finnaly做了一个

pip install cairocffi

现在我只是让python.exe停止工作。

尝试使用GTK3agg和GTK3Cairo后端,我有相同的结果

环顾四周,我发现也许cairo版本已经过时了matplotlib使用的函数,但我不知道如何继续。

如果我尝试运行其他东西,Cairocffi会工作。

更多信息(来自以下评论):

我仍然遇到未处理的win32错误。我设法打开错误并说:

Unhandled exception at 0x08CF6D58 (libcairo-2.dll) in python.exe:
0xC0000005: Access violation reading location 0x000000A8.
If there is a handler for this exception, the program may be safely continued. 

它只是崩溃......

2 个答案:

答案 0 :(得分:0)

我在matplotlib中使用Python3 + Gtk3遇到了一些问题。我找到了this cookbook page的工作示例。尝试在cookbook中运行示例 - 尤其是最简单的示例:

#!/usr/bin/python3

from gi.repository import Gtk

from matplotlib.figure import Figure
from numpy import arange, pi, random, linspace
import matplotlib.cm as cm
#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

myfirstwindow = Gtk.Window()
myfirstwindow.connect("delete-event", Gtk.main_quit)
myfirstwindow.set_default_size(400, 400)

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

sw = Gtk.ScrolledWindow()
myfirstwindow.add(sw) 

canvas = FigureCanvas(fig)
canvas.set_size_request(400,400)
sw.add_with_viewport(canvas)

myfirstwindow.show_all()
Gtk.main()

此外,并非您需要一个相当新版本的matplotlib来使Python3上的内容正常工作。

如果您仍有问题,请向我们提供完整的错误消息。

注意:我在Linux上测试了这个(没有Windows),但是,从你的问题描述来看,这个问题是常见问题。

答案 1 :(得分:0)

多年来,我在Windows上遇到相同的问题。 matplotlib 2.0.0 realease的文档指出Gtk3 backend is not supported on Windows。最近,我在Linux(Ubuntu)下运行Gtk3Agg后端时遇到问题。在这两种情况下,它总是与开罗有关。

因此,我编写了此后端的自己的实现,您可以找到它here。从我的模块中导入FigureCanvasGtk3Agg,并以与官方相同的方式使用它。它缺少一些功能,但是,如果您只想显示一个图,它将完成工作。

您可以通过运行模块来尝试该模块,它应该在窗口中显示一个简单的彩色图形。我在Linux和Windows上都尝试过,没有问题。

工作原理:

诀窍是避免在Python3中导入Cairo,因为通常它不起作用(以我的经验)。通过使用GdkPixbuf完成。

然后Gdk.cairo_set_source_pixbuf完成其余工作,并在'draw-event'回调中调用Gtk提供的cairo上下文的两个方法。 Cairo永远不会导入模块中。