1# Show how to do switchable panels.
2
3from Tkinter import *
4
5class App:
6
7    def __init__(self, top=None, master=None):
8        if top is None:
9            if master is None:
10                top = Tk()
11            else:
12                top = Toplevel(master)
13        self.top = top
14        self.buttonframe = Frame(top)
15        self.buttonframe.pack()
16        self.panelframe = Frame(top,  borderwidth=2, relief=GROOVE)
17        self.panelframe.pack(expand=1, fill=BOTH)
18        self.panels = {}
19        self.curpanel = None
20
21    def addpanel(self, name, klass):
22        button = Button(self.buttonframe, text=name,
23                        command=lambda self=self, name=name: self.show(name))
24        button.pack(side=LEFT)
25        frame = Frame(self.panelframe)
26        instance = klass(frame)
27        self.panels[name] = (button, frame, instance)
28        if self.curpanel is None:
29            self.show(name)
30
31    def show(self, name):
32        (button, frame, instance) = self.panels[name]
33        if self.curpanel:
34            self.curpanel.pack_forget()
35        self.curpanel = frame
36        frame.pack(expand=1, fill="both")
37
38class LabelPanel:
39    def __init__(self, frame):
40        self.label = Label(frame, text="Hello world")
41        self.label.pack()
42
43class ButtonPanel:
44    def __init__(self, frame):
45        self.button = Button(frame, text="Press me")
46        self.button.pack()
47
48def main():
49    app = App()
50    app.addpanel("label", LabelPanel)
51    app.addpanel("button", ButtonPanel)
52    app.top.mainloop()
53
54if __name__ == '__main__':
55    main()
56