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

None: FontChooser (last edited 2008-03-25 00:52:02 by RonLongo)