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
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
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
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
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