Commit fe84d17a authored by Martin v. Löwis's avatar Martin v. Löwis

Patch #764217: Add nametofont function, exists parameter.

parent 1a789292
...@@ -25,6 +25,11 @@ ROMAN = "roman" ...@@ -25,6 +25,11 @@ ROMAN = "roman"
BOLD = "bold" BOLD = "bold"
ITALIC = "italic" ITALIC = "italic"
def nametofont(name):
"""Given the name of a tk named font, returns a Font representation.
"""
return Font(name=name, exists=True)
class Font: class Font:
"""Represents a named font. """Represents a named font.
...@@ -32,8 +37,12 @@ class Font: ...@@ -32,8 +37,12 @@ class Font:
Constructor options are: Constructor options are:
font -- font specifier (name, system font, or (family, size, style)-tuple) font -- font specifier (name, system font, or (family, size, style)-tuple)
name -- name to use for this font configuration (defaults to a unique name)
exists -- does a named font by this name already exist?
Creates a new named font if False, points to the existing font if True.
Raises _tkinter.TclError if the assertion is false.
or any combination of the following are ignored if font is specified:
family -- font 'family', e.g. Courier, Times, Helvetica family -- font 'family', e.g. Courier, Times, Helvetica
size -- font size in points size -- font size in points
...@@ -41,7 +50,7 @@ class Font: ...@@ -41,7 +50,7 @@ class Font:
slant -- font slant: ROMAN, ITALIC slant -- font slant: ROMAN, ITALIC
underline -- font underlining: false (0), true (1) underline -- font underlining: false (0), true (1)
overstrike -- font strikeout: false (0), true (1) overstrike -- font strikeout: false (0), true (1)
name -- name to use for this font configuration (defaults to a unique name)
""" """
def _set(self, kw): def _set(self, kw):
...@@ -63,7 +72,7 @@ class Font: ...@@ -63,7 +72,7 @@ class Font:
options[args[i][1:]] = args[i+1] options[args[i][1:]] = args[i+1]
return options return options
def __init__(self, root=None, font=None, name=None, **options): def __init__(self, root=None, font=None, name=None, exists=False, **options):
if not root: if not root:
root = Tkinter._default_root root = Tkinter._default_root
if font: if font:
...@@ -74,7 +83,20 @@ class Font: ...@@ -74,7 +83,20 @@ class Font:
if not name: if not name:
name = "font" + str(id(self)) name = "font" + str(id(self))
self.name = name self.name = name
root.tk.call("font", "create", name, *font)
if exists:
self.delete_font = False
# confirm font exists
if self.name not in root.tk.call("font", "names"):
raise Tkinter._tkinter.TclError, "named font %s does not already exist" % (self.name,)
# if font config info supplied, apply it
if font:
print "font=%r" % font
root.tk.call("font", "configure", self.name, *font)
else:
# create new font (raises TclError if the font exists)
root.tk.call("font", "create", self.name, *font)
self.delete_font = True
# backlinks! # backlinks!
self._root = root self._root = root
self._split = root.tk.splitlist self._split = root.tk.splitlist
...@@ -83,12 +105,22 @@ class Font: ...@@ -83,12 +105,22 @@ class Font:
def __str__(self): def __str__(self):
return self.name return self.name
def __eq__(self, other):
return self.name == other.name and isinstance(other, Font)
def __getitem__(self, key):
return self.cget(key)
def __setitem__(self, key, value):
self.configure(**{key: value})
def __del__(self): def __del__(self):
try: try:
self._call("font", "delete", self.name) if self.delete_font:
self._call("font", "delete", self.name)
except (AttributeError, Tkinter.TclError): except (AttributeError, Tkinter.TclError):
pass pass
def copy(self): def copy(self):
"Return a distinct copy of the current font" "Return a distinct copy of the current font"
return Font(self._root, **self.actual()) return Font(self._root, **self.actual())
......
...@@ -44,6 +44,11 @@ Extension modules ...@@ -44,6 +44,11 @@ Extension modules
Library Library
------- -------
- A new function tkFont.nametofont was added to return an existing
font. The Font class constructor now has an additional exists argument
which, if True, requests to return/configure an existing font, rather
than creating a new one.
- Updated the decimal package's min() and max() methods to match the - Updated the decimal package's min() and max() methods to match the
latest revision of the General Decimal Arithmetic Specification. latest revision of the General Decimal Arithmetic Specification.
Quiet NaNs are ignored and equal values are sorted based on sign Quiet NaNs are ignored and equal values are sorted based on sign
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment