matplotlib, wxPanel inside a wxPanel

ajaksu ajaksu at gmail.com
Sat Aug 12 14:07:14 EDT 2006


It seems to work (only tested with embedding_in_wx4.py). I guess it's
something related to things nesting in a slightly wrong way, right
enough to show up but wrong enough to only show up :)

I hope this helps.
Daniel

Substitute embedding_in_wx4.py's CanvasFrame with:

class CanvasFrame(wxFrame):
    def __init__(self):
        # Begin just like embedding_in_wx4.py
        wxFrame.__init__(self,None,-1,
                         'CanvasFrame',size=(550,350))

        self.figure = Figure(figsize=(5,4), dpi=100)
        self.axes = self.figure.add_subplot(111)
        t = range(0,30)
        s = [randint(1, 30)* random() * x for x in t]
        self.axes.plot(t,s)
        # Add panels from deepest level
        self.main_panel = wxPanel(self, -1)
        # Parent is main_panel:
        self.graph_panel = wxPanel(self.main_panel, -1)
        # self.canvas is child of  graph_panel...
        self.canvas = FigureCanvas(self.graph_panel, -1, self.figure)
        # ... as is textgraph
        self.text_graph = wxTextCtrl(self.graph_panel, -1, "Hello!\n" +
                                    "I'm in graph_panel",
                                    style=wxTE_MULTILINE)
        self.toolbar = MyNavigationToolbar(self.canvas, True)
        self.toolbar.Realize()
        self.graph_panel_sizer = wxBoxSizer(wxVERTICAL)

        tw, th = self.toolbar.GetSizeTuple()
        fw, fh = self.canvas.GetSizeTuple()
        self.toolbar.SetSize(wxSize(fw, th))
        self.graph_panel_sizer.Add(self.toolbar, 0, wxEXPAND)

        # After the toolbar, add its siblings to graph_panel_sizer
        self.graph_panel_sizer.Add(self.canvas, 1, wxEXPAND)
        self.graph_panel_sizer.Add(self.text_graph)
        self.graph_panel.SetSizer(self.graph_panel_sizer)
        self.graph_panel.Fit()
        # graph_panel is done, just add it to main_panel's sizer.

        self.main_panel_sizer =  wxBoxSizer(wxVERTICAL)
        self.text_in = wxTextCtrl(self.main_panel, -1,
                                "Inside main_panel",
                                style=wxTE_MULTILINE)
        # Here:
        self.main_panel_sizer.Add(self.graph_panel,1, wxEXPAND)
        self.main_panel_sizer.Add(self.text_in,0, wxEXPAND)
        self.main_panel.SetSizer(self.main_panel_sizer)
        self.main_panel.Fit()

        self.sizer = wxBoxSizer(wxVERTICAL)
        self.sizer.Add(self.main_panel, 1, wxEXPAND)
        self.sizer_text = wxBoxSizer(wxHORIZONTAL)
        self.text_hi = wxTextCtrl(self, -1, "Hello :)",
                                 style=wxTE_MULTILINE)
        self.text_out = wxTextCtrl(self, -1,"Outside main_panel",
                                  style=wxTE_MULTILINE|wxEXPAND)

        self.sizer_text.Add(self.text_hi, 0, wxEXPAND)
        self.sizer_text.Add(self.text_out, 0, wxEXPAND)
        self.sizer.Add(self.sizer_text, 0, wxEXPAND)
        EVT_PAINT(self, self.OnPaint)
        self.toolbar.update()
        self.SetSizer(self.sizer)
        self.Fit()

    def OnPaint(self, event):
        self.canvas.draw()
        event.Skip()




More information about the Python-list mailing list