1 import Tix
   2 import tkSimpleDialog
   3 import tkFont
   4 
   5 
   6 class FontChooser( tkSimpleDialog.Dialog ):
   7    BASIC = 1
   8    ALL   = 2
   9 
  10    def __init__( self, parent, defaultfont=None, showstyles=None ):
  11       self._family       = Tix.StringVar(  value='Ariel'       )
  12       self._sizeString   = Tix.StringVar(  value='12'          )
  13       self._weight       = Tix.StringVar(  value=tkFont.NORMAL )
  14       self._slant        = Tix.StringVar(  value=tkFont.ROMAN  )
  15       self._isUnderline  = Tix.BooleanVar( value=False         )
  16       self._isOverstrike = Tix.BooleanVar( value=False         )
  17       
  18       if defaultfont:
  19          self._initialize( defaultfont )
  20       
  21       self._currentFont  = tkFont.Font( font=self.getFontTuple() )
  22       
  23       self._showStyles   = showstyles
  24       
  25       self.sampleText      = None
  26       
  27       tkSimpleDialog.Dialog.__init__( self, parent, 'Font Chooser' )
  28 
  29    def _initialize( self, aFont ):
  30       if not isinstance( aFont, tkFont.Font ):
  31          aFont = tkFont.Font( font=aFont )
  32       
  33       fontOpts = aFont.actual( )
  34       
  35       self._family.set(       fontOpts[ 'family'     ] )
  36       self._sizeString.set(   fontOpts[ 'size'       ] )
  37       self._weight.set(       fontOpts[ 'weight'     ] )
  38       self._slant.set(        fontOpts[ 'slant'      ] )
  39       self._isUnderline.set(  fontOpts[ 'underline'  ] )
  40       self._isOverstrike.set( fontOpts[ 'overstrike' ] )
  41 
  42    def body( self, master ):
  43       theRow = 0
  44       
  45       Tix.Label( master, text="Font Family" ).grid( row=theRow, column=0 )
  46       Tix.Label( master, text="Font Size" ).grid( row=theRow, column=2 )
  47       
  48       theRow += 1
  49       
  50       # Font Families
  51       fontList = Tix.ComboBox( master, command=self.selectionChanged, dropdown=False, editable=False, selectmode=Tix.IMMEDIATE, variable=self._family )
  52       fontList.grid( row=theRow, column=0, columnspan=2, sticky=Tix.N+Tix.S+Tix.E+Tix.W, padx=10 )
  53       first = None
  54       familyList = list(tkFont.families( ))
  55       familyList.sort()
  56       for family in familyList:
  57          if family[0] == '@':
  58             continue
  59          if first is None:
  60             first = family
  61          fontList.insert( Tix.END, family )
  62       fontList.configure( value=first )
  63       
  64       # Font Sizes
  65       sizeList = Tix.ComboBox( master, command=self.selectionChanged, dropdown=False, editable=False, selectmode=Tix.IMMEDIATE, variable=self._sizeString )
  66       sizeList.grid( row=theRow, column=2, columnspan=2, sticky=Tix.N+Tix.S+Tix.E+Tix.W, padx=10 )
  67       for size in xrange( 6,31 ):
  68          sizeList.insert( Tix.END, '%d' % size )
  69       sizeList.configure( value='9' )
  70       
  71       # Styles
  72       if self._showStyles is not None:
  73          theRow += 1
  74          
  75          if self._showStyles in ( FontChooser.ALL, FontChooser.BASIC ):
  76             Tix.Label( master, text='Styles', anchor=Tix.W ).grid( row=theRow, column=0, pady=10, sticky=Tix.W )
  77             
  78             theRow += 1
  79             
  80             Tix.Checkbutton( master, text="bold", command=self.selectionChanged, offvalue='normal', onvalue='bold', variable=self._weight ).grid(row=theRow, column=0)
  81             Tix.Checkbutton( master, text="italic", command=self.selectionChanged, offvalue='roman', onvalue='italic', variable=self._slant ).grid(row=theRow, column=1)
  82          
  83          if self._showStyles == FontChooser.ALL:
  84             Tix.Checkbutton( master, text="underline", command=self.selectionChanged, offvalue=False, onvalue=True, variable=self._isUnderline ).grid(row=theRow, column=2)
  85             Tix.Checkbutton( master, text="overstrike", command=self.selectionChanged, offvalue=False, onvalue=True, variable=self._isOverstrike ).grid(row=theRow, column=3)
  86       
  87       # Sample Text
  88       theRow += 1
  89       
  90       Tix.Label( master, text='Sample Text', anchor=Tix.W ).grid( row=theRow, column=0, pady=10, sticky=Tix.W )
  91       
  92       theRow += 1
  93       
  94       self.sampleText = Tix.Text( master, height=11, width=70 )
  95       self.sampleText.insert( Tix.INSERT,
  96                               'ABCDEFGHIJKLMNOPQRSTUVWXYZ\nabcdefghijklmnopqrstuvwxyz', 'fontStyle' )
  97       self.sampleText.config( state=Tix.DISABLED )
  98       self.sampleText.tag_config( 'fontStyle', font=self._currentFont )
  99       self.sampleText.grid( row=theRow, column=0, columnspan=4, padx=10 )
 100 
 101    def apply( self ):
 102       self.result = self.getFontTuple( )
 103 
 104    def selectionChanged( self, something=None ):
 105       self._currentFont.configure( family=self._family.get(), size=self._sizeString.get(),
 106                                    weight=self._weight.get(), slant=self._slant.get(),
 107                                    underline=self._isUnderline.get(),
 108                                    overstrike=self._isOverstrike.get() )
 109 
 110       if self.sampleText:
 111          self.sampleText.tag_config( 'fontStyle', font=self._currentFont )
 112 
 113    def getFontTuple( self ):
 114       family = self._family.get()
 115       size   = int(self._sizeString.get())
 116       
 117       styleList = [ ]
 118       if self._weight.get() == tkFont.BOLD:
 119          styleList.append( 'bold' )
 120       if self._slant.get() == tkFont.ITALIC:
 121          styleList.append( 'italic' )
 122       if self._isUnderline.get():
 123          styleList.append( 'underline' )
 124       if self._isOverstrike.get():
 125          styleList.append( 'overstrike' )
 126          
 127       if len(styleList) == 0:
 128          return family, size
 129       else:
 130          return family, size, ' '.join( styleList )
 131 
 132 def askChooseFont( parent, defaultfont=None, showstyles=FontChooser.ALL ):
 133    return FontChooser( parent, defaultfont=defaultfont, showstyles=showstyles ).result
 134 
 135 if __name__ == '__main__':
 136    root = Tix.Tk( )
 137    font = askChooseFont( root )
 138 
 139    if font:
 140       print font
 141 

tkinter: FontChooser (last edited 2010-07-26 11:59:12 by localhost)