Pmw.NoteBook: tabbed pane
#Pmw copyright #Copyright 1997-1999 Telstra Corporation Limited, Australia #Copyright 2000-2002 Really Good Software Pty Ltd, Australia #Permission is hereby granted, free of charge, to any person obtaining a copy #of this software and associated documentation files (the "Software"), to deal #in the Software without restriction, including without limitation the rights #to use, copy, modify, merge, publish, distribute, sublicense, and/or sell #copies of the Software, and to permit persons to whom the Software is furnished #to do so, subject to the following conditions: #The above copyright notice and this permission notice shall be included in all #copies or substantial portions of the Software. #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, #INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A #PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT #HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION #OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE #SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. title = 'Pmw.NoteBook demonstration (more complex)' # Import Pmw from this directory tree. import sys sys.path[:0] = ['../../..'] import Tkinter import Pmw class Demo: def __init__(self, parent, withTabs = 1): # Repeat random number sequence for each run. self.rand = 12345 # Default demo is to display a tabbed notebook. self.withTabs = withTabs # Create a frame to put everything in self.mainframe = Tkinter.Frame(parent) self.mainframe.pack(fill = 'both', expand = 1) # Find current default colors button = Tkinter.Button() defaultbg = button.cget('background') defaultfg = button.cget('foreground') button.destroy() # Create the list of colors to cycle through self.colorList = [] self.colorList.append((defaultbg, defaultfg)) self.colorIndex = 0 for color in Pmw.Color.spectrum(6, 1.5, 1.0, 1.0, 1): bg = Pmw.Color.changebrightness(self.mainframe, color, 0.85) self.colorList.append((bg, 'black')) bg = Pmw.Color.changebrightness(self.mainframe, color, 0.55) self.colorList.append((bg, 'white')) # Set the color to the current default Pmw.Color.changecolor(self.mainframe, defaultbg, foreground = defaultfg) defaultPalette = Pmw.Color.getdefaultpalette(self.mainframe) Pmw.Color.setscheme(self.mainframe, defaultbg, foreground = defaultfg) # Create the notebook, but don't pack it yet. if self.withTabs: tabpos = 'n' else: tabpos = None self.notebook = Pmw.NoteBook(self.mainframe, tabpos = tabpos, createcommand = PrintOne('Create'), lowercommand = PrintOne('Lower'), raisecommand = PrintOne('Raise'), hull_width = 300, hull_height = 200, ) # Create a buttonbox to configure the notebook and pack it first. buttonbox = Pmw.ButtonBox(self.mainframe) buttonbox.pack(side = 'bottom', fill = 'x') # Add some buttons to the buttonbox to configure the notebook. buttonbox.add('Insert\npage', command = self.insertpage) buttonbox.add('Delete\npage', command = self.deletepage) buttonbox.add('Add\nbutton', command = self.addbutton) buttonbox.add('Change\ncolor', command = self.changecolor) buttonbox.add('Natural\nsize', command = self.notebook.setnaturalsize) if not self.withTabs: # Create the selection widget to select the page in the notebook. self.optionmenu = Pmw.OptionMenu(self.mainframe, menubutton_width = 10, command = self.notebook.selectpage ) self.optionmenu.pack(side = 'left', padx = 10) # Pack the notebook last so that the buttonbox does not disappear # when the window is made smaller. self.notebook.pack(fill = 'both', expand = 1, padx = 5, pady = 5) # Populate some pages of the notebook. page = self.notebook.add('tmp') self.notebook.delete('tmp') page = self.notebook.add('Appearance') if self.withTabs: self.notebook.tab('Appearance').focus_set() button = Tkinter.Button(page, text = 'Welcome\nto\nthe\nAppearance\npage') button.pack(expand = 1) page = self.notebook.add('Fonts') button = Tkinter.Button(page, text = 'This is a very very very very wide Fonts page') button.pack(expand = 1) page = self.notebook.insert('Applications', before = 'Fonts') button = Tkinter.Button(page, text = 'This is the Applications page') button.pack(expand = 1) # Initialise the first page and the initial colour. if not self.withTabs: self.optionmenu.setitems(self.notebook.pagenames()) apply(Pmw.Color.setscheme, (self.mainframe,), defaultPalette) self.pageCounter = 0 def insertpage(self): # Create a page at a random position defaultPalette = Pmw.Color.getdefaultpalette(self.mainframe) bg, fg = self.colorList[self.colorIndex] Pmw.Color.setscheme(self.mainframe, bg, foreground = fg) self.pageCounter = self.pageCounter + 1 before = self.randomchoice(self.notebook.pagenames() + [Pmw.END]) pageName = 'page%d' % self.pageCounter if self.pageCounter % 5 == 0: tab_text = pageName + '\nline two' else: tab_text = pageName classes = (None, Tkinter.Button, Tkinter.Label, Tkinter.Checkbutton) cls = self.randomchoice((None,) + classes) if cls is None: print 'Adding', pageName, 'as a frame with a button' if self.withTabs: page = self.notebook.insert(pageName, before, tab_text = tab_text) else: page = self.notebook.insert(pageName, before) button = Tkinter.Button(page, text = 'This is button %d' % self.pageCounter) button.pack(expand = 1) else: print 'Adding', pageName, 'using', cls if self.withTabs: page = self.notebook.insert(pageName, before, tab_text = tab_text, page_pyclass = cls, page_text = 'This is a page using\na %s' % str(cls) ) else: page = self.notebook.insert(pageName, before, page_pyclass = cls, page_text = 'This is a page using\na %s' % str(cls) ) if not self.withTabs: self.optionmenu.setitems( self.notebook.pagenames(), self.notebook.getcurselection()) apply(Pmw.Color.setscheme, (self.mainframe,), defaultPalette) def addbutton(self): # Add a button to a random page. defaultPalette = Pmw.Color.getdefaultpalette(self.mainframe) bg, fg = self.colorList[self.colorIndex] Pmw.Color.setscheme(self.mainframe, bg, foreground = fg) framePages = [] for pageName in self.notebook.pagenames(): page = self.notebook.page(pageName) if page.__class__ == Tkinter.Frame: framePages.append(pageName) if len(framePages) == 0: self.notebook.bell() return pageName = self.randomchoice(framePages) print 'Adding extra button to', pageName page = self.notebook.page(pageName) button = Tkinter.Button(page, text = 'This is an extra button') button.pack(expand = 1) apply(Pmw.Color.setscheme, (self.mainframe,), defaultPalette) def deletepage(self): # Delete a random page pageNames = self.notebook.pagenames() if len(pageNames) == 0: self.notebook.bell() return pageName = self.randomchoice(pageNames) print 'Deleting', pageName self.notebook.delete(pageName) if not self.withTabs: self.optionmenu.setitems( self.notebook.pagenames(), self.notebook.getcurselection()) def changecolor(self): self.colorIndex = self.colorIndex + 1 if self.colorIndex == len(self.colorList): self.colorIndex = 0 bg, fg = self.colorList[self.colorIndex] print 'Changing color to', bg Pmw.Color.changecolor(self.mainframe, bg, foreground = fg) self.notebook.recolorborders() # Simple random number generator. def randomchoice(self, selection): num = len(selection) self.rand = (self.rand * 125) % 2796203 index = self.rand % num return selection[index] class PrintOne: def __init__(self, text): self.text = text def __call__(self, text): print self.text, text ###################################################################### # Create demo in root window for testing. if __name__ == '__main__': root = Tkinter.Tk() Pmw.initialise(root) root.title(title) widget = Demo(root) exitButton = Tkinter.Button(root, text = 'Exit', command = root.destroy) exitButton.pack() root.mainloop()
1. | Tabbed Pane Demo | ||
2. | Tab pane with four pages | ||
3. | Tab control: Pmw.NoteBook demonstration |