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)