Отображение графика matplotlib в растровом изображении wxPython - PullRequest
1 голос
/ 09 июля 2019

Я пытаюсь сгенерировать граф из matplotlib, сохранить его в буфере, а затем установить его как растровое изображение в окне wxPython.

Следующий код показывает, что я пытаюсь сделать. Если я заменю изображение, сохраненное в буфере, на файл PNG, загруженный с диска, программа выполнится, как и ожидалось.

import io
import wx
import numpy as np
import matplotlib.pyplot as plt

class MainPanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent=parent)
        self.SetSize((1024,768))
        self.SetBackgroundColour('yellow')

        #Generate Sample Graph
        t = np.arange(0.0, 2.0, 0.01)
        s = 1 + np.sin(2 * np.pi * t)
        fig, ax = plt.subplots()
        ax.plot(t, s)

        ax.set(xlabel='time (s)', ylabel='voltage (mV)',
               title='About as simple as it gets, folks')
        ax.grid()

        #Save into Buffer
        buf = io.BytesIO()
        plt.savefig(buf,format='png')

        self.Image = wx.Image(buf, wx.BITMAP_TYPE_ANY)
        self.Image = wx.StaticBitmap(self, wx.ID_ANY, 
                                         wx.Bitmap(self.Image))
        self.sizer = wx.BoxSizer(wx.HORIZONTAL)
        self.sizer.Add(self.Image,1,wx.ALIGN_CENTRE)
        self.SetSizer(self.sizer)

class MyForm(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY,
            "Graph to Image Test", size=(1024,768))
        self.panel = MainPanel(self)


if __name__ == "__main__":
    app = wx.App(False)
    frame = MyForm()
    frame.Show()
    app.MainLoop()

Я получаю следующее сообщение об ошибке, и программа останавливается:

Traceback (most recent call last):
 File "/home/mike/Projects/Python/wxerg/wx + matplotlib test.py", line 42, in <module>
frame = MyForm()
 File "/home/mike/Projects/Python/wxerg/wx + matplotlib test.py", line 37, in __init__
self.panel = MainPanel(self)
 File "/home/mike/Projects/Python/wxerg/wx + matplotlib test.py", line 28, in __init__
wx.Bitmap(self.Image))
wx._core.wxAssertionError: C++ assertion "image.IsOk()" failed at /home/vagrant/wxPython-4.0.4/ext/wxWidgets/src/gtk/bitmap.cpp(581) in wxBitmap(): invalid image

1 Ответ

1 голос
/ 11 июля 2019

Вам необходимо переустановить позицию в буфере обратно на ноль, чтобы wx.Image считывал данные с начала, а не с конца.

#Save into Buffer
buf = io.BytesIO()
plt.savefig(buf,format='png')
buf.seek(0)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...