使用tempfile作为wxPython图像小部件的源

时间:2018-03-11 01:14:35

标签: python matplotlib wxpython temporary-files

我正在使用pyplot.savefig将matplotlib图保存为.png并且此代码有效:

pyplot.savefig('tempfile.png', bbox_inches='tight', pad_inches=0.0)
i = wx.Image('tempfile.png', 'image/png', -1)
i.Resize(size=(500,500), pos=(0,0), red=255, green=255, blue=255)
png = i.ConvertToBitmap()
self.xrayImage = wx.StaticBitmap(self.panel, -1, png, (380,10), (500,500))

我不希望在程序执行后有这个tempfile.png,理想情况下它甚至不会出现在用户的环境中。我一直在尝试使用python的临时文件功能,但不断获取无效图像,或者不是来自i.Resize行的.png图像。我已经尝试过使用tempfile.TemporaryFile和tempfile.NamedTemporaryFile,但两者都没有工作。以下是我尝试过的一些示例:

temp_png = tempfile.NamedTemporaryFile(suffix='.png')
pyplot.savefig(temp_png)
i.wx.Image(temp_png, 'image/png', -1)
i.Resize(size=(500,500), pos=(0,0), red=255, green=255, blue=255)
png = i.ConvertToBitmap()
self.xrayImage = wx.StaticBitmap(self.panel, -1, png, (380,10), (500,500))

with tempfile.TemporaryFile(suffix=".png") as tmpfile:
    pyplot.savefig(tmpfile)
    tmpfile.seek(0)
    i = wx.Image(tmpfile, 'image/png', -1)
    # also tried:
    # i = wx.Image(tmpfile.read(), 'image/png', -1)
    # i = wx.Image(b64encode(tmpfile.read()), 'image/png', -1)
    i.Resize(size=(500,500), pos=(0,0), red=255, green=255, blue=255)
png = i.ConvertToBitmap()
self.xrayImage = wx.StaticBitmap(self.panel, -1, png, (380,10), (500,500))

任何帮助将不胜感激!只要用户的计算机上没有文件,我也愿意不使用python的tempfile。

3 个答案:

答案 0 :(得分:1)

根据User ImportanceOfBeingEarnest的建议:完全删除tempfile并使用缓冲区存储savefig的结果(使用wxPython 4.0.1测试)

import wx

from io import BytesIO
from matplotlib import pyplot as plt
from matplotlib import rc

def get_pyplot_img():
    rc('savefig', format='png')
    buf = BytesIO()
    plt.plot([0, 1, 2], [0, 1, 4], '-')
    plt.savefig(buf)
    # reset buf pointer
    buf.seek(0)
    return buf

def get_bitmap(buf):
    img = wx.Image(buf, wx.BITMAP_TYPE_PNG)
    return wx.Bitmap(img)

答案 1 :(得分:0)

为什么不在显示后删除图像文件?

import wx
import os
import matplotlib
matplotlib.use('agg')
from matplotlib import pyplot as plt

class TestFrame(wx.Frame):
    def __init__(self, *args):
        wx.Frame.__init__(self, *args)
        plt.plot([1.5,2.0,2.5])
        fig = plt.gcf()
        fig.savefig("/tmp/myimg.png", transparent=True)
        aText = wx.StaticText(self,-1,("My Image Display"))
        img = wx.Image("/tmp/myimg.png", wx.BITMAP_TYPE_ANY)
        Image = wx.StaticBitmap(self, bitmap=wx.BitmapFromImage(img))
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(aText,0,0,0)
        sizer.Add(Image,1,0,0)
        self.SetSizer(sizer)
        self.Fit()
        self.Show()
        os.remove("/tmp/myimg.png")

if __name__ == "__main__":
    app = wx.App()
    myframe = TestFrame(None, -1, "Image Test")
    app.MainLoop()

答案 2 :(得分:0)

尝试将wx.Bitmap保存到使用tempfile.TemporaryFile创建的临时文件时,我遇到了完全相同的问题。 wx.Bitmap.SaveFile()返回False,我不知道为什么。

作为一种解决方法,我使用了一个临时文件夹,它可以正常工作。类似于:

with tempfile.TemporaryDirectory() as directory:
  success = image.SaveFile(directory + "\\temp.png", wx.BITMAP_TYPE_PNG)
  if success:
    do_something_with_the_picture(directory + "\\temp.png")