Bonjour,

j'aimerai savoir en cas d’affichage de zoom dans une frame peut-on afficher ce zoom dans une panel dans notre application ?

j'ai cette petite app permet d'afficher un zoom sélectionner par un rectangle l'affichage ce fait sur une nouvelle frame qui apparaisse à chaque fois que je bouge le rectangle j'aimerai l’intégrer dans une panel surtout que le zoom s'affiche à chaque fois que je défini la région plusieurs fenêtre apparait à chaque fois !!

voilà code :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
import wx
import numpy as np
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
from matplotlib.figure import Figure
from matplotlib.widgets import RectangleSelector
import matplotlib
import matplotlib.pyplot as plt
 
 
 
class Window(wx.Frame):
    """ Fenêtre principale de l'application """
 
    def __init__(self, **kwargs):
        super().__init__(None, **kwargs)
        ROO = RootPanel(self)
        right = RightPanel(self)
        sizer = wx.BoxSizer(wx.HORIZONTAL)
        sizer.Add(ROO, 2, wx.EXPAND)
        sizer.Add(right, 5, wx.EXPAND)
        self.SetSizer(sizer)
 
class RightPanel(wx.Panel):
    def __init__(self,parent):
        super().__init__(parent)
        self.SetBackgroundColour('yellow')
 
 
 
class RootPanel(wx.Panel):
    """ Panel contenant tous les autres widgets de l'application """
 
    def __init__(self, parent):
        super().__init__(parent)
 
        panel_buttons = wx.Panel(self)
        panel_buttons_sizer = wx.GridSizer(1, 2, 0, 0)
 
        canvas_panel = CanvasPanel(self)
 
        select_button = PickButton(
            panel_buttons,
            "netCDF4 files (nc)|*.nc",
            canvas_panel.load_from_file,
            label="Show on this window (nc)",
        )
        toplevel_select_button = TopLevelPickButton(
            panel_buttons,
            "Text files (txt)|*.txt|All files|*.*",
            label="Show on separate window (txt)",
        )
        panel_buttons_sizer.Add(select_button)
        panel_buttons_sizer.Add(toplevel_select_button)
        panel_buttons.SetSizer(panel_buttons_sizer)
 
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(panel_buttons)
        sizer.Add(canvas_panel)
        self.SetSizer(sizer)
 
 
class PickButton(wx.Button):
    """ Bouton permettant de choisir un fichier """
 
    def __init__(self, parent, wildcard, func, **kwargs):
        # func est la méthode à laquelle devra être foruni le fichier sélectionné
        super().__init__(parent, **kwargs)
        self.wildcard = wildcard
        self.func = func
        self.Bind(wx.EVT_BUTTON, self.pick_file)
 
    def pick_file(self, evt):
        style = style = wx.FD_OPEN | wx.FD_FILE_MUST_EXIST | wx.FD_MULTIPLE
        with wx.FileDialog(
            self, "Pick files", wildcard=self.wildcard, style=style
        ) as fileDialog:
            if fileDialog.ShowModal() != wx.ID_CANCEL:
                chosen_file = fileDialog.GetPath()
                self.func(chosen_file)
 
 
class TopLevelPickButton(PickButton):
    """ Permet de choisir un fichier et d'ouvrir une toplevel """
 
    def __init__(self, parent, wildcard, **kwargs):
        super().__init__(parent, wildcard, self.create_toplevel, **kwargs)
 
    def create_toplevel(self, file_name):
        """ Ouvre une toplevel et affiche le graphique """
        self.win = TopLevelCanvas(self.Parent)
        self.win.canvas_panel.load_from_file(file_name)
        self.win.Show()
 
 
class CanvasPanel(wx.Panel):
    """ Panel du graphique matplotlib """
    def __init__(self, parent , size=(200,250)):
        super().__init__(parent)
        self.figure = Figure(figsize =(5,6))
        self.canvas = FigureCanvas(self, -1, self.figure)
        self.Size = self.canvas.Size
        self.zoom_axis = []
 
    def load_from_file(self, file_name):
        """
        Méthode effectuant l'intermédiaire pour charger le fichier selon
        son type
        """
        self.axes = self.figure.add_subplot(111)
        if file_name.endswith(".nc"):
            self._load_nc(file_name)
        else:
            self._load_txt(file_name)
        self.canvas.draw()
 
    def _load_txt(self, file_name):
        self._load_nc(file_name)
 
    def _load_nc(self, file_name):
        """ Simule le chargement et affichage à partir d'un fichier nc """
         t = np.arange(0.0, 8.0, 0.01)
         s = np.sin(3 * np.pi * t)
 
         self.axes.plot(t,s)
 
 
 
 
        self.RS = RectangleSelector(self.axes,self.line_select_callback,
                                       drawtype='box', useblit=False,
                                       button=[1, 3],minspanx=5, minspany=5,
                                       spancoords='pixels',
                                       interactive=True, rectprops = dict(facecolor='None',edgecolor='red',alpha=5,fill=False))
 
 
        #self.RS.to_draw.set_visible(True)
        #self.figure.canvas.draw()
        #self.RS.extents = (0,4,1,5)
 
    def line_select_callback(self, eclick, erelease):
        'eclick and erelease are the press and release events'
        x1, y1 = eclick.xdata, eclick.ydata
        x2, y2 = erelease.xdata, erelease.ydata
        self.zoom_axis=[x1,x2,y1,y2]
        Zoom(parent=self)
 
 
class Zoom(wx.Frame):
    def __init__(self,parent):
        wx.Frame.__init__(self,parent,-1,("Zoom"))
        self.parent =  parent
 
 
        zoom_axis=parent.zoom_axis
 
        #duplicate the plot from the main panel
        self.figure = Figure(figsize =(5,6))
        self.canvas = FigureCanvas(self, -1, self.figure)
        self.axes = self.figure.add_subplot(111)
 
        t = np.arange(0.0, 8.0, 0.01)
        s = np.sin(3 * np.pi * t)
 
 
        self.axes.axis(zoom_axis)
        self.axes.plot(t, s)
        self.canvas.draw()
        self.Show()
 
 
 
 
 
class TopLevelCanvas(wx.Frame):
    """ Fenêtre affichant uniquement un graph matplotlib """
 
    def __init__(self, parent):
        super().__init__(parent)
        self.canvas_panel = CanvasPanel(self)
        self.Size = self.canvas_panel.Size
 
 
class App(wx.App):
    def OnInit(self):
        win = Window(title="A test dialog", size=(1000, 800))
        win.Show()
        return True
 
 
if __name__ == "__main__":
    app = App()
    app.MainLoop()
est il possible de changer zoom de frame en panel pour l'afficher en rightpanel ?

merci