【问题标题】:Making Matplotlib and GTK3 work on python3 windows使 Matplotlib 和 GTK3 在 python3 窗口上工作
【发布时间】:2016-07-20 07:37:32
【问题描述】:

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

我有一个带有 32 位 python 3.4 和 Matplotib 的连续 anaconda 设置,通过 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


    【解决方案1】:

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

    #!/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),但是,根据您对问题的描述,这个问题(曾经)是一个常见问题。

    【讨论】:

    • 您好,我也找到了这个网站并试了一下。我仍然收到未处理的 win32 错误。我设法打开错误并显示:python.exe 中 0x08CF6D58 (libcairo-2.dll) 处的未处理异常:0xC0000005:访问冲突读取位置 0x000000A8。如果有这个异常的处理程序,程序可以安全地继续。它只是崩溃......
    • 帮不上什么忙——据我了解,Gtk3Agg 后端目前无法正常工作,因此您别无选择,只能使用 Gtk3Cairo 后端。这一切背后的问题是对 Introspection 的更改以将 Python3 链接到 Gtk3。 Matplotlib 最初没有使用 Introspection,并且“刚刚”更新为使用它。但这意味着您的问题可能源自许多不同的地方。您可能会考虑在 Python2 中尝试您的程序。差别不大。
    【解决方案2】:

    多年来,我在 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 上下文的两个方法。 Cairo 从不导入到模块中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-18
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多