Issue #3033: Add displayof parameter to tkinter font.

Patch by Guilherme Polo.
This commit is contained in:
Andrew Svetlov 2012-04-05 12:41:20 +03:00
parent 9a13b432e7
commit 20bbf54f5e
2 changed files with 29 additions and 17 deletions

View file

@ -2,9 +2,6 @@
# #
# written by Fredrik Lundh, February 1998 # written by Fredrik Lundh, February 1998
# #
# FIXME: should add 'displayof' option where relevant (actual, families,
# measure, and metrics)
#
__version__ = "0.9" __version__ = "0.9"
@ -124,14 +121,17 @@ class Font:
"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())
def actual(self, option=None): def actual(self, option=None, displayof=None):
"Return actual font attributes" "Return actual font attributes"
args = ()
if displayof:
args = ('-displayof', displayof)
if option: if option:
return self._call("font", "actual", self.name, "-"+option) args = args + ('-' + option, )
return self._call("font", "actual", self.name, *args)
else: else:
return self._mkdict( return self._mkdict(
self._split(self._call("font", "actual", self.name)) self._split(self._call("font", "actual", self.name, *args)))
)
def cget(self, option): def cget(self, option):
"Get font attribute" "Get font attribute"
@ -148,32 +148,42 @@ class Font:
configure = config configure = config
def measure(self, text): def measure(self, text, displayof=None):
"Return text width" "Return text width"
return int(self._call("font", "measure", self.name, text)) args = (text,)
if displayof:
args = ('-displayof', displayof, text)
return int(self._call("font", "measure", self.name, *args))
def metrics(self, *options): def metrics(self, *options, **kw):
"""Return font metrics. """Return font metrics.
For best performance, create a dummy widget For best performance, create a dummy widget
using this font before calling this method.""" using this font before calling this method."""
args = ()
displayof = kw.pop('displayof', None)
if displayof:
args = ('-displayof', displayof)
if options: if options:
args = args + self._get(options)
return int( return int(
self._call("font", "metrics", self.name, self._get(options))) self._call("font", "metrics", self.name, *args))
else: else:
res = self._split(self._call("font", "metrics", self.name)) res = self._split(self._call("font", "metrics", self.name, *args))
options = {} options = {}
for i in range(0, len(res), 2): for i in range(0, len(res), 2):
options[res[i][1:]] = int(res[i+1]) options[res[i][1:]] = int(res[i+1])
return options return options
def families(root=None): def families(root=None, displayof=None):
"Get font families (as a tuple)" "Get font families (as a tuple)"
if not root: if not root:
root = tkinter._default_root root = tkinter._default_root
return root.tk.splitlist(root.tk.call("font", "families")) args = ()
if displayof:
args = ('-displayof', displayof)
return root.tk.splitlist(root.tk.call("font", "families", *args))
def names(root=None): def names(root=None):
@ -205,10 +215,10 @@ if __name__ == "__main__":
print(f.measure("hello"), f.metrics("linespace")) print(f.measure("hello"), f.metrics("linespace"))
print(f.metrics()) print(f.metrics(displayof=root))
f = Font(font=("Courier", 20, "bold")) f = Font(font=("Courier", 20, "bold"))
print(f.measure("hello"), f.metrics("linespace")) print(f.measure("hello"), f.metrics("linespace", displayof=root))
w = tkinter.Label(root, text="Hello, world", font=f) w = tkinter.Label(root, text="Hello, world", font=f)
w.pack() w.pack()

View file

@ -19,6 +19,8 @@ Core and Builtins
Library Library
------- -------
- Issue #3033: Add displayof parameter to tkinter font. Patch by Guilherme Polo.
- Issue #14482: Raise a ValueError, not a NameError, when trying to create - Issue #14482: Raise a ValueError, not a NameError, when trying to create
a multiprocessing Client or Listener with an AF_UNIX type address under a multiprocessing Client or Listener with an AF_UNIX type address under
Windows. Patch by Popa Claudiu. Windows. Patch by Popa Claudiu.