wxPython面板中matplotlib数字的大小调整不正确

时间:2015-01-09 20:58:00

标签: matplotlib wxpython

我试图在wxPython应用程序的面板中并排放置两个matplotlib数字。这曾经用于wxPython 2.8,但不再用于wxPython 3.0。

在wxPython 2.8中,每个绘图的宽度是面板大小的一半。在wxPython 3.0中,图的宽度等于面板大小,这意味着只显示左侧的图。扩展窗口然后最终揭示右侧的情节。

重现问题的最简单示例如下。

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

class MainFrame(wx.Frame):
    def __init__(self, *args, **kwargs):
        wx.Frame.__init__(self, *args, **kwargs)

        panel = wx.Panel(self)
        sizer = wx.BoxSizer(wx.HORIZONTAL)
        sizer.Add(TestPlot(panel), 1, wx.EXPAND | wx.ALL, border=5)
        sizer.Add(TestPlot(panel), 1, wx.EXPAND | wx.ALL, border=5)
        panel.SetSizerAndFit(sizer)

class TestPlot(wx.Window):
    def __init__(self, *args, **kwargs):
        wx.Window.__init__(self, *args, **kwargs)

        self.canvas = FigureCanvasWxAgg(self, wx.ID_ANY, Figure())

        sizer = wx.BoxSizer(wx.HORIZONTAL)
        sizer.Add(self.canvas, 1, wx.ALL, border=20)
        self.SetSizerAndFit(sizer)

if __name__ == "__main__":
    app = wx.App()
    MainFrame(parent=None, size=(300, 300)).Show()
    app.MainLoop()

如何在wxPython 3.0中使用此布局?

2 个答案:

答案 0 :(得分:0)

替换

    panel.SetSizerAndFit(sizer)

通过

    panel.SetSizer(sizer)
    sizer.Fit(self)

最后将wx.Frame调整为panel中的元素。

答案 1 :(得分:0)

我在wxpython 3.0上遇到了同样的问题。

我认为问题是self.canvas的默认最小尺寸太大。

self.canvas.SetMinSize(wx.Size(1,1))之前手动将最小尺寸设置为一些非常小的值 似乎解决了这个问题。虽然不是一个优雅的方式......

以下是您的示例的固定版本。

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

class MainFrame(wx.Frame):
    def __init__(self, *args, **kwargs):
        wx.Frame.__init__(self, *args, **kwargs)

        panel = wx.Panel(self)
        sizer = wx.BoxSizer(wx.HORIZONTAL)
        sizer.Add(TestPlot(panel), 1, wx.EXPAND | wx.ALL, border=5)
        sizer.Add(TestPlot(panel), 1, wx.EXPAND | wx.ALL, border=5)
        panel.SetSizer(sizer)
        # don't do Fit(), as it sets the canvases to its minimum size
        panel.Layout()

class TestPlot(wx.Window):
    def __init__(self, *args, **kwargs):
        wx.Window.__init__(self, *args, **kwargs)

        self.canvas = FigureCanvasWxAgg(self, wx.ID_ANY, Figure())
        # setting the minimum canvas size as small as possible
        self.canvas.SetMinSize(wx.Size(1,1))

        sizer = wx.BoxSizer(wx.HORIZONTAL)
        # added wx.EXPAND so that the canvas can stretch vertically
        sizer.Add(self.canvas, 1, wx.ALL|wx.EXPAND, border=20)
        self.SetSizer(sizer)

if __name__ == "__main__":
    app = wx.App()
    MainFrame(parent=None, size=(300, 300)).Show()
    app.MainLoop()

希望这会有所帮助。

在Windows 8.1 / Python 2.7.9 / matplotlib 1.4.3 / wxpython 3.0.0.0上测试