2015-01-09 3 views
1

Я пытаюсь иметь две фигуры matplotlib бок о бок внутри панели в приложении wxPython. Это использовалось для работы с wxPython 2.8, но уже не в wxPython 3.0.Неправильная калибровка фигур matplotlib в панели wxPython

В 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

Я не знаю, рамки WX на всех, но от того, что вы описали и код запахи Я предполагаю, что проблема в том, что wx изменил, как он работает с 'sizer.Add (TestPlot (панель), 1, wx.EXPAND | wx.ALL, border = 5)' – tacaswell

ответ

0

Заменить

panel.SetSizerAndFit(sizer) 

по

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

, чтобы окончательно настроить wx.Frame к элементам в panel.

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/1.4.3 Matplotlib/WxPython 3.0.0.0

Смежные вопросы