3 # written by Fredrik Lundh, February 1998
5 # FIXME: should add 'displayof' option where relevant (actual, families,
6 # measure, and metrics)
20 """Given the name of a tk named font, returns a Font representation.
22 return Font(name
=name
, exists
=True)
26 """Represents a named font.
28 Constructor options are:
30 font -- font specifier (name, system font, or (family, size, style)-tuple)
31 name -- name to use for this font configuration (defaults to a unique name)
32 exists -- does a named font by this name already exist?
33 Creates a new named font if False, points to the existing font if True.
34 Raises _Tkinter.TclError if the assertion is false.
36 the following are ignored if font is specified:
38 family -- font 'family', e.g. Courier, Times, Helvetica
39 size -- font size in points
40 weight -- font thickness: NORMAL, BOLD
41 slant -- font slant: ROMAN, ITALIC
42 underline -- font underlining: false (0), true (1)
43 overstrike -- font strikeout: false (0), true (1)
49 for k
, v
in kw
.items():
51 options
.append(str(v
))
60 def _mkdict(self
, args
):
62 for i
in range(0, len(args
), 2):
63 options
[args
[i
][1:]] = args
[i
+1]
66 def __init__(self
, root
=None, font
=None, name
=None, exists
=False, **options
):
68 root
= Tkinter
._default
_root
70 # get actual settings corresponding to the given font
71 font
= root
.tk
.splitlist(root
.tk
.call("font", "actual", font
))
73 font
= self
._set
(options
)
75 name
= "font" + str(id(self
))
79 self
.delete_font
= False
81 if self
.name
not in root
.tk
.call("font", "names"):
82 raise Tkinter
._tkinter
.TclError
, "named font %s does not already exist" % (self
.name
,)
83 # if font config info supplied, apply it
85 root
.tk
.call("font", "configure", self
.name
, *font
)
87 # create new font (raises TclError if the font exists)
88 root
.tk
.call("font", "create", self
.name
, *font
)
89 self
.delete_font
= True
92 self
._split
= root
.tk
.splitlist
93 self
._call
= root
.tk
.call
98 def __eq__(self
, other
):
99 return self
.name
== other
.name
and isinstance(other
, Font
)
101 def __getitem__(self
, key
):
102 return self
.cget(key
)
104 def __setitem__(self
, key
, value
):
105 self
.configure(**{key
: value
})
110 self
._call
("font", "delete", self
.name
)
111 except (KeyboardInterrupt, SystemExit):
117 "Return a distinct copy of the current font"
118 return Font(self
._root
, **self
.actual())
120 def actual(self
, option
=None):
121 "Return actual font attributes"
123 return self
._call
("font", "actual", self
.name
, "-"+option
)
126 self
._split
(self
._call
("font", "actual", self
.name
))
129 def cget(self
, option
):
131 return self
._call
("font", "config", self
.name
, "-"+option
)
133 def config(self
, **options
):
134 "Modify font attributes"
136 self
._call
("font", "config", self
.name
,
140 self
._split
(self
._call
("font", "config", self
.name
))
145 def measure(self
, text
):
147 return int(self
._call
("font", "measure", self
.name
, text
))
149 def metrics(self
, *options
):
150 """Return font metrics.
152 For best performance, create a dummy widget
153 using this font before calling this method."""
157 self
._call
("font", "metrics", self
.name
, self
._get
(options
))
160 res
= self
._split
(self
._call
("font", "metrics", self
.name
))
162 for i
in range(0, len(res
), 2):
163 options
[res
[i
][1:]] = int(res
[i
+1])
166 def families(root
=None):
167 "Get font families (as a tuple)"
169 root
= Tkinter
._default
_root
170 return root
.tk
.splitlist(root
.tk
.call("font", "families"))
172 def names(root
=None):
173 "Get names of defined fonts (as a tuple)"
175 root
= Tkinter
._default
_root
176 return root
.tk
.splitlist(root
.tk
.call("font", "names"))
178 # --------------------------------------------------------------------
181 if __name__
== "__main__":
186 f
= Font(family
="times", size
=30, weight
=NORMAL
)
189 print f
.actual("family")
190 print f
.actual("weight")
193 print f
.cget("family")
194 print f
.cget("weight")
198 print f
.measure("hello"), f
.metrics("linespace")
202 f
= Font(font
=("Courier", 20, "bold"))
203 print f
.measure("hello"), f
.metrics("linespace")
205 w
= Tkinter
.Label(root
, text
="Hello, world", font
=f
)
208 w
= Tkinter
.Button(root
, text
="Quit!", command
=root
.destroy
)
211 fb
= Font(font
=w
["font"]).copy()
212 fb
.config(weight
=BOLD
)