[Tkinter-discuss] How to change font sizes in a Tkinter app
stewart at midtoad.homelinux.org
stewart at midtoad.homelinux.org
Tue Sep 14 02:23:05 CEST 2004
I posted a question on this topic a few days, and got three interesting, and
quite varied, approaches to a solution from Jeff Epler, Martin Franklin and
Michael Lange. One of the approaches apparently works under Linux, but wouldn't
work (for me) under Windows, at least not yet. I had the most success adopting
Martin's approach, which is contained in modified form in the code sample below.
Note that my sample app makes use of Pmw, which you can get from
http://pmw.sf.net. My app allows the user to change the font face or the font
colour interactively. I leave it as an exercise for the reader to be able to
change the font face as well (e.g. from Helvetica to Roman or Courier).
This list is invaluable for me, because I'm coming across material that seems to
be absent from any of the information sources I have so far for Tkinter.
thanks again!
cheers
Stewart
---
#MenuBarFontApp.py
title = 'FontChange demonstration'
# Import Pmw from this directory tree.
import sys
sys.path[:0] = ['../../..']
import Tkinter
import Pmw
class Demo:
def __init__(self, parent):
self.font=('Helvetica', 10, 'normal')
print 'base font is ', self.font
# Create and pack the MenuBar.
menuBar = Pmw.MenuBar(parent,
hull_relief = 'raised',
hull_borderwidth = 1)
menuBar.pack(fill = 'x')
self.menuBar = menuBar
# Add some buttons to the MenuBar.
menuBar.addmenu('File', 'Close this window or exit', font=self.font)
menuBar.addmenuitem('File', 'command', 'Close this window',
command = PrintOne('Action: close'),
font=self.font,
label = 'Close')
menuBar.addmenuitem('File', 'separator')
menuBar.addmenuitem('File', 'command', 'Exit the application',
command = lambda: sys.exit("Bye"),
font=self.font,
label = 'Exit')
menuBar.addmenu('Options', 'Set general app options', font=self.font)
menuBar.addcascademenu('Options', 'Font Size',
'Change global fonts', traverseSpec = 'z', tearoff = 1, font=self.font)
for size in ('tiny', 'small', 'average', 'big', 'huge', 'monstrous'):
menuBar.addmenuitem('Font Size', 'command', 'Set size to ' + size,
command = lambda ss=size: WidgetWalker(ss),
font=self.font,
label = size)
menuBar.addcascademenu('Options', 'Font Colour',
'Change global fonts', traverseSpec = 'z', tearoff = 1, font=self.font)
for colour in ('black', 'blue', 'red', 'green', 'grey', 'brown'):
menuBar.addmenuitem('Font Colour', 'command', 'Set size to ' + colour,
command = lambda ss=colour: WidgetWalker2(ss),
font=self.font,
label = colour)
# Create and pack the main part of the window.
self.mainPart = Tkinter.Label(parent,
text = 'This is the\nmain part of\nthe window',
font=self.font,
background = 'white',
foreground = 'black',
padx = 30,
pady = 30)
self.mainPart.pack(fill = 'both', expand = 1)
class PrintOne:
def __init__(self, text):
self.text = text
def __call__(self):
print self.text
#set font size
class WidgetWalker:
def __init__(self,size):
self.parent = root # parent
self.size = size
newFont = {'tiny': ('Helvetica', 6, 'normal'),
'small': ('Helvetica', 8, 'normal'),
'average': ('Helvetica', 10, 'normal'),
'big': ('Helvetica', 12, 'normal'),
'huge': ('Helvetica', 14, 'normal'),
'monstrous': ('Helvetica', 18, 'normal')}
self.newFont = newFont
self.walk(self.parent)
def update(self, widget):
try:
widget["font"] = self.newFont[self.size]
except:
pass
def walk(self, top):
self.update(top)
for child in top.children.values():
print 'child is ', child
self.walk(child)
#set font colour
class WidgetWalker2:
def __init__(self,colour):
self.parent = root # parent
self.colour = colour
self.walk(self.parent)
def update(self, widget):
try:
widget["fg"] = self.colour
except:
pass
def walk(self, top):
self.update(top)
for child in top.children.values():
print 'child is ', child
self.walk(child)
######################################################################
# Create demo in root window for testing.
if __name__ == '__main__':
root = Tkinter.Tk()
Pmw.initialise(root)
root.title(title)
exitButton = Tkinter.Button(root, text = 'Exit', command = root.destroy)
exitButton.pack(side = 'bottom')
widget = Demo(root)
root.mainloop()
More information about the Tkinter-discuss
mailing list