J’ai écrit un programme en wxpython qui fonctionne très bien dans Windows, mais testé dans lunix, j’ai quelques problèmes d’affichage qui se produisent tous dans Linux.
Voici un test qui illustre le problème du redimensionnement du FigureCanvasWxAgg dans un panneau, car vu que le panneau lui-même suit le redimensionnement, mais que FigureCanvasWxAgg ne suit pas, cela ne pose cependant aucun problème dans Windows.
import wx import matplotlib.figure as plt from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas import wx.lib.inspection class Test(wx.Frame): def __init__(self): super(Test, self).__init__(parent=None, id=-1) self.figure = plt.Figure() self.panel = wx.Panel(self, 1) self.figurepanel = FigureCanvas(self.panel, -1, self.figure) self.axes1 = self.figure.add_subplot(111) frame_box = wx.BoxSizer(wx.VERTICAL) frame_box.AddStretchSpacer(prop=1) frame_box.Add(self.panel, flag=wx.EXPAND, proportion=2) frame_box.AddStretchSpacer(prop=1) main_box = wx.BoxSizer(wx.HORIZONTAL) main_box.AddStretchSpacer(prop=1) main_box.Add(frame_box, flag=wx.EXPAND, proportion=1) main_box.AddStretchSpacer(prop=1) self.SetSizer(main_box) self.Show() self.Layout() def main(): app = wx.App() Test() wx.lib.inspection.InspectionTool().Show() app.MainLoop() if __name__ == '__main__': main()
Ce que je serais très reconnaissant d’avoir répondu est:
Il y a plusieurs problèmes avec le code que vous avez posté:
self.figurepanel
ne fait partie d’aucun sizer, ce qui signifie qu’il ne sera pas redimensionné même si son conteneur, self.panel
fait. Le code ci-dessous produit une fenêtre remplie par un tracé qui redimensionne avec la fenêtre:
import wx import matplotlib.figure as plt from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas import wx.lib.inspection class Test(wx.Frame): def __init__(self): super(Test, self).__init__(parent=None, id=-1) self.panel = wx.Panel(self, 1) self.panel.SetBackgroundColour('RED') self.figure = plt.Figure() self.axes1 = self.figure.add_subplot(111) self.figurepanel = FigureCanvas(self.panel, -1, self.figure) main_box = wx.BoxSizer(wx.HORIZONTAL) main_box.Add(self.figurepanel, flag=wx.EXPAND, proportion=1) self.panel.SetSizer(main_box) frame_box = wx.BoxSizer(wx.VERTICAL) frame_box.Add(self.panel, flag=wx.EXPAND, proportion=1) self.SetSizer(frame_box) self.Show() self.Layout() def main(): app = wx.App() Test() wx.lib.inspection.InspectionTool().Show() app.MainLoop() if __name__ == '__main__': main()
Il n’y a pas besoin de faire de redimensionnement manuel, et il n’y a pas de problème, je pense, avec la propagation des événements de redimensionnement. S’il y en a, il y aurait beaucoup plus de casse que ce que vous voyez.
Je pense avoir corrigé le problème. Le problème est causé par le wx.EVT_SIZE qui semble être automatique dans Windows, mais pas sous Linux. Donc, pour résoudre le problème sous Linux, il suffit de lier le fichier wx.Panel au fichier wx.EVT_SIZE, puis de définir un gestionnaire d’événements approprié qui prend en charge le redimensionnement. Ce qui a fait l’affaire pour moi était:
#code beneath is a part if the __init__ metod self.panel = wx.Panel(self, -1) self.figurepanel = FigureCanvas(self.panel, -1, self.figure) self.panel.Bind(wx.EVT_SIZE, self.on_size) .... #the eventhandler for the panel. The method resizes the the figurepanel and the figure. def on_size(self, event): pix = self.panel.GetClientSize() self.figure.set_size_inches(pix[0]/self.figure.get_dpi(), pix[1]/self.figure.get_dpi()) x,y = self.panel.GetSize() self.figurepanel.SetSize((x-1, y-1)) self.figurepanel.SetSize((x, y)) self.figurepanel.draw() event.Skip()