我试图在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中使用此布局?
答案 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上测试