From 3d16d3e643671279ff0ae6372edd8893b11f04ed Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Tue, 11 Aug 1998 19:07:58 +0000 Subject: Fredrik Lundh's font wrapper. --- Lib/lib-tk/tkFont.py | 192 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 192 insertions(+) create mode 100644 Lib/lib-tk/tkFont.py diff --git a/Lib/lib-tk/tkFont.py b/Lib/lib-tk/tkFont.py new file mode 100644 index 0000000..5e9abed --- /dev/null +++ b/Lib/lib-tk/tkFont.py @@ -0,0 +1,192 @@ +# +# Tkinter +# $Id$ +# +# font wrapper +# +# written by Fredrik Lundh , February 1998 +# +# FIXME: should add 'displayof' option where relevant (actual, families, +# measure, and metrics) +# +# Copyright (c) Secret Labs AB 1998. +# +# info@pythonware.com +# http://www.pythonware.com +# + +__version__ = "0.9" + +import Tkinter +import string + +# weight/slant +NORMAL = "normal" +BOLD = "bold" +ITALIC = "italic" + +class Font: + + """Represents a named font. + + Constructor options are: + + font -- font specifier (name, system font, or (family, size, style)-tuple) + + or any combination of + + family -- font 'family', e.g. Courier, Times, Helvetica + size -- font size in points + weight -- font thickness: NORMAL, BOLD + slant -- font slant: NORMAL, ITALIC + underline -- font underlining: 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): + options = [] + for k, v in kw.items(): + options.append("-"+k) + options.append(str(v)) + return tuple(options) + + def _get(self, args): + options = [] + for k in args: + options.append("-"+k) + return tuple(options) + + def _mkdict(self, args): + options = {} + for i in range(0, len(args), 2): + options[args[i][1:]] = args[i+1] + return options + + def __init__(self, root=None, font=None, name=None, **options): + if not root: + root = Tkinter._default_root + if font: + # get actual settings corresponding to the given font + font = root.tk.splitlist(root.tk.call("font", "actual", font)) + else: + font = self._set(options) + if not name: + name = "font" + str(id(self)) + self.name = name + apply(root.tk.call, ("font", "create", name) + font) + # backlinks! + self._root = root + self._split = root.tk.splitlist + self._call = root.tk.call + + def __str__(self): + return self.name + + def __del__(self): + try: + self._call("font", "delete", self.name) + except (AttributeError, Tkinter.TclError): + pass + + def copy(self): + "Return a distinct copy of the current font" + return apply(Font, (self._root,), self.actual()) + + def actual(self, option=None): + "Return actual font attributes" + if option: + return self._call("font", "actual", self.name, "-"+option) + else: + return self._mkdict( + self._split(self._call("font", "actual", self.name)) + ) + + def cget(self, option): + "Get font attribute" + return self._call("font", "config", self.name, "-"+option) + + def config(self, **options): + "Modify font attributes" + if options: + apply(self._call, ("font", "config", self.name) + + self._set(options)) + else: + return self._mkdict( + self._split(self._call("font", "config", self.name)) + ) + + configure = config + + def measure(self, text): + "Return text width" + return string.atoi(self._call("font", "measure", self.name, text)) + + def metrics(self, *options): + """Return font metrics. + + For best performance, create a dummy widget + using this font before calling this method.""" + + if options: + return string.atoi( + self._call("font", "metrics", self.name, self._get(options)) + ) + else: + res = self._split(self._call("font", "metrics", self.name)) + options = {} + for i in range(0, len(res), 2): + options[res[i][1:]] = string.atoi(res[i+1]) + return options + +def families(root=None): + "Get font families (as a tuple)" + if not root: + root = Tkinter._default_root + return root.tk.splitlist(root.tk.call("font", "families")) + +def names(root=None): + "Get names of defined fonts (as a tuple)" + if not root: + root = Tkinter._default_root + return root.tk.splitlist(root.tk.call("font", "names")) + +# -------------------------------------------------------------------- +# test stuff + +if __name__ == "__main__": + + root = Tkinter.Tk() + + # create a font + f = Font(family="times", size=30, weight=NORMAL) + + print f.actual() + print f.actual("family") + print f.actual("weight") + + print f.config() + print f.cget("family") + print f.cget("weight") + + print names() + + print f.measure("hello"), f.metrics("linespace") + + print f.metrics() + + f = Font(font=("Courier", 20, "bold")) + print f.measure("hello"), f.metrics("linespace") + + w = Tkinter.Label(root, text="Hello, world", font=f) + w.pack() + + w = Tkinter.Button(root, text="Quit!", command=root.destroy) + w.pack() + + fb = Font(font=w["font"]).copy() + fb.config(weight=BOLD) + + w.config(font=fb) + + Tkinter.mainloop() -- cgit v0.12