FigureCanvasWxAgg ne redimensionne pas correctement dans le panneau (ou le bloc-notes) sous Linux

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:

  • Comment est-ce que je résous ce problème de reszing FigureCanvasWxAgg dans Linux
  • Existe-t-il une différence dans la manière générale de programmer l’interface graphique avec wxPython sous Windows et sous Linux

Il y a plusieurs problèmes avec le code que vous avez posté:

  1. Vous disposez d’espaceurs horizontaux et verticaux qui se dilatent au besoin, ce qui fait que la région centrale rest la même
  2. 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()