在wx中嵌入透明的matplotlib图形画布

3
我有一个使用wxPython编写的GUI,其中嵌入了一个matplotlib图形。我希望该图形的背景颜色与整个GUI(非常大)的背景颜色相同。不幸的是,GUI的确切颜色取决于操作系统,因此设置固定的背景颜色是不够的,因为它会随着操作系统而改变。因此,我在创建matplotlib-figure时尝试使用facecolor ='none'。然而,这导致了一些意想不到的问题(见下图):每次重新绘制画布时,标签文本和刻度线都会变粗,就好像字体的重量正在改变一样。我发现了这个三年前的问题,它似乎处理了一个非常相似的问题,但它没有任何解决方案或关于如何解决的评论。这是matplotlib / wxpython的预期特性还是仅仅是一个尚未修复的错误?

以下是示例代码以展示问题。我创建了两个FigureCanvases,第一个具有facecolor='b'背景,使用它时,每次重新绘制画布时文本不会变粗。第二个画布使用facecolor ='none',每次重新绘制画布时文本都会变得越来越粗。

import wx
from matplotlib.figure import Figure
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg


class MyCanvas(wx.Panel):
    def __init__(self, parent, col):
        wx.Panel.__init__(self, parent, id=-1)

        self.fig = Figure(figsize=(1, 1), edgecolor='k', facecolor=col)
        self.ax = self.fig.add_subplot(1, 1, 1)
        self.ax.set_ylabel('Label')
        self.fig.subplots_adjust(left=0.5)
        self.canvas = FigureCanvasWxAgg(self, -1, self.fig)

        szr_ctr = wx.BoxSizer(wx.VERTICAL)
        szr_ctr.Add(self.canvas, 1, wx.ALL | wx.GROW)
        self.SetSizerAndFit(szr_ctr)

        wx.CallAfter(self.canvas.draw)


class wind(wx.Frame):

    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent)

        self.i = 0
        figsizer = wx.BoxSizer(wx.HORIZONTAL)

        self.canvas1 = MyCanvas(self, col='b')
        figsizer.Add(self.canvas1, 1, wx.GROW | wx.ALL)

        self.canvas2 = MyCanvas(self, col='none')
        figsizer.Add(self.canvas2, 1, wx.GROW | wx.ALL)

        button = wx.Button(self, wx.ID_CLOSE, "Press me")
        button.Bind(wx.EVT_BUTTON, self.on_button)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(figsizer, 1, wx.ALL | wx.GROW, 10)
        sizer.Add(button, 0, wx.ALL, 10)


        self.SetSizer(sizer)
        self.Layout()
        self.Show()

    def on_button(self, event):
        wx.CallAfter(self.canvas1.canvas.draw)
        wx.CallAfter(self.canvas2.canvas.draw)


if __name__ == '__main__':
    wxapp = wx.App(redirect=False)
    v = wind(None, "Fig")
    wxapp.MainLoop()

蓝色背景的图像表现正常。 当在几次画布重绘后使用 none 背景的图像会变得越来越厚重,包括文字和坐标轴线。

enter image description here


编辑

将重新绘制的函数更改为下面的内容可以解决画布没有被正确重新绘制的问题。

def on_button(self, event):
    wx.CallAfter(self.canvas1.canvas.draw)
    wx.CallAfter(self.canvas2.canvas.draw)
    wx.CallAfter(self.canvas1.Refresh)  #  <-----------
    wx.CallAfter(self.canvas2.Refresh)  #  <-----------
1个回答

2

在进一步调试后,我意识到问题可以通过在self.canvas_i.canvas.draw()之后使用self.canvas_i.Refresh()来解决。据我所知,Refresh将标记画布为"需要重新绘制",强制完全重绘它。这会覆盖任何旧内容,使其仅有一个迭代的旧(每次新的canvas.draw仅在旧内容上绘制新东西,略微放置在旁边以获得"更粗的文本")。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接