| """Interface to the native font selection dialog. |
| |
| The FontChooser class gives access to the "tk fontchooser" command. |
| The dialog is application-global: all instances configure the single |
| dialog of the Tcl interpreter. |
| |
| The dialog may be modeless, so show() may return immediately. |
| """ |
| |
| import tkinter |
| from tkinter.font import Font |
| |
| __all__ = ["FontChooser"] |
| |
| |
| class FontChooser: |
| """The font selection dialog. |
| |
| Supported configuration options are: |
| |
| parent: the window to which the dialog and its virtual |
| events are related (the main window by default) |
| title: the title of the dialog |
| font: the font that is currently selected in the dialog |
| command: a callback that is called with a tkinter.font.Font |
| object wrapping the selected font when the user |
| selects a font |
| visible: whether the dialog is currently displayed |
| (read-only) |
| |
| The "font" option accepts the forms supported by |
| tkinter.font.Font(font=...). |
| |
| The "command" callback is the only reliable way to obtain the |
| selected font. On some platforms the "font" option is not updated |
| to the user's choice. |
| """ |
| |
| def __init__(self, master=None, **options): |
| if master is None: |
| master = options.get('parent') |
| if master is None: |
| master = tkinter._get_default_root('create a font chooser') |
| self.master = master |
| self._command_name = None |
| if options: |
| self.configure(options) |
| |
| def configure(self, cnf=None, **kw): |
| """Query or modify the options of the font dialog. |
| |
| With no arguments, return a dict of all option values. With a |
| string argument, return the value of that option. Otherwise, |
| set the given options. The "visible" option is read-only. |
| """ |
| if kw: |
| cnf = tkinter._cnfmerge((cnf, kw)) |
| elif cnf: |
| cnf = tkinter._cnfmerge(cnf) |
| master = self.master |
| if cnf is None: |
| items = master.tk.splitlist(master.tk.call( |
| 'tk', 'fontchooser', 'configure')) |
| return {items[i][1:]: items[i+1] for i in range(0, len(items), 2)} |
| if isinstance(cnf, str): |
| return master.tk.call('tk', 'fontchooser', 'configure', '-' + cnf) |
| cnf = dict(cnf) |
| new_name = None |
| if 'command' in cnf: |
| command = cnf['command'] |
| if command is None: |
| cnf['command'] = '' |
| elif callable(command): |
| # Pass the selected font to the callback as a Font object. |
| def callback(description): |
| command(Font(self.master, font=description, exists=True)) |
| # Name the Tcl command after the callback. |
| callback.__func__ = command |
| new_name = cnf['command'] = master._register(callback) |
| try: |
| master.tk.call('tk', 'fontchooser', 'configure', |
| *master._options(cnf)) |
| except tkinter.TclError: |
| if new_name is not None: |
| master.deletecommand(new_name) |
| raise |
| if 'command' in cnf: |
| if self._command_name is not None: |
| master.deletecommand(self._command_name) |
| self._command_name = new_name |
| config = configure |
| |
| def cget(self, option): |
| """Return the value of the given option of the font dialog.""" |
| return self.master.tk.call('tk', 'fontchooser', 'configure', |
| '-' + option) |
| |
| def show(self): |
| """Display the font dialog. |
| |
| Depending on the platform, may return immediately or only |
| once the dialog has been withdrawn. |
| """ |
| self.master.tk.call('tk', 'fontchooser', 'show') |
| |
| def hide(self): |
| """Hide the font dialog if it is displayed.""" |
| self.master.tk.call('tk', 'fontchooser', 'hide') |