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()
Related examples in the same category