Using a wxPython Notebook with Panels

Credit: Mark Nenadov

Problem

You want to design a wxPython GUI comprised of multiple panels—each driven by a separate Python script running in the background—that let the user switch back and forth (i.e., a wxPython Notebook).

Solution

Notebooks are a powerful GUI approach, as they let the user select the desired view from several options at any time with an instinctive button click. wxPython supports this by supplying a wxNotebook widget:

from wxPython.wx import *

class MainFrame(wxFrame):
    #
    # snipped: mainframe class attributes
    #
    def _ _init_ _(self, parent, id, title):
        #
        # snipped: frame-specific initialization
        #

        # Create the notebook
        self.nb = wxNotebook(self, -1,
            wxPoint(0,0), wxSize(0,0), wxNB_FIXEDWIDTH)

        # Populate the notebook with pages (panels)
        panel_names = "First Panel", "Second Panel", "The Third One"
        panel_scripts = "panel1", "panel2", "panel3"
        for name, script in zip(panel_names, panel_scripts):
            # Make panel named 'name' (driven by script 'script'.py)
            self.module = _ _import_ _(script, globals(  ))
            self.window = self.module.runPanel(self, self.nb)
            if self.window: self.nb.AddPage(self.window, name)

        #
        # snipped: rest of frame initialization
        #

Discussion

wxPython provides a powerful notebook user-interface object, with multiple panels, each of which is built and driven by a separate Python script. Each panel’s script runs in the background, even when the panel is not selected, and maintains state as the user switches back and forth.

Of course, this recipe isn’t a fully functional wxPython application, but it demonstrates how to use notebooks and panels (which it loads by importing files) adequately. Of course, this recipe assumes that you have files named panel1.py, panel2.py, and panel3.py, each of which contains a runPanel function that returns a wxPanel object. The specific notebook functionality is easy: the notebook object is created by the wxNotebook function, and an instance of this recipe’s MainFrame class saves its notebook object as the self.nb instance attribute. Then, each page (a wxPanel object) is added to the notebook by calling the notebook’s AddPage method, with the page object as the first argument and a name string as the second. Your code only needs to make the notebook and its panels usable; the wxWindows framework, as wrapped by the wxPython package, handles all the rest on your behalf.

See Also

wxPython, and the wxWindows toolkit it depends on, are described in detail at http://www.wxPython.org and http://www.wxWindows.org.

Get Python Cookbook now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.