使Matplotlib和GTK3在python3窗口上运行

问题描述 投票:1回答:2

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

我有一个连续的anaconda设置与32位python 3.4和Matplotib通过conda安装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二进制文件

最后做了一个

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. 

它只是崩溃了......

python matplotlib networkx gtk3 cairo
2个回答
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),但是,从你的问题描述来看,这个问题是常见问题。


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完成剩下的工作,同时调用Gtk在'draw-event'回调中提供的两个cairo上下文方法。开罗从未在模块中导入。

© www.soinside.com 2019 - 2024. All rights reserved.