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