diff --git a/Lib/lib-tk/ttk.py b/Lib/lib-tk/ttk.py index 43da7269564..c2907c95594 100644 --- a/Lib/lib-tk/ttk.py +++ b/Lib/lib-tk/ttk.py @@ -29,32 +29,41 @@ import Tkinter _flatten = Tkinter._flatten -# Verify if Tk is new enough to not need Tile checking +# Verify if Tk is new enough to not need the Tile package _REQUIRE_TILE = True if Tkinter.TkVersion < 8.5 else False -def _loadttk(loadtk): - # This extends the default Tkinter.Tk._loadtk method so we can be - # sure that ttk is available for use, or not. - def _wrapper(self): - loadtk(self) +def _load_tile(master): + if _REQUIRE_TILE: + import os + tilelib = os.environ.get('TILE_LIBRARY') + if tilelib: + # append custom tile path to the the list of directories that + # Tcl uses when attempting to resolve packages with the package + # command + master.tk.eval( + 'global auto_path; ' + 'lappend auto_path {%s}' % tilelib) - if _REQUIRE_TILE: - import os - tilelib = os.environ.get('TILE_LIBRARY') - if tilelib: - # append custom tile path to the the list of directories that - # Tcl uses when attempting to resolve packages with the package - # command - self.tk.eval('global auto_path; ' - 'lappend auto_path {%s}' % tilelib) - self.tk.eval('package require tile') # TclError may be raised here + master.tk.eval('package require tile') # TclError may be raised here + master._tile_loaded = True - return _wrapper -# Store the original Tkinter.Tk._loadtk before replacing it just in case -# someone wants to restore it. -__loadtk__ = Tkinter.Tk._loadtk -Tkinter.Tk._loadtk = _loadttk(Tkinter.Tk._loadtk) +def _setup_master(master=None): + """If master is not None, itself is returned. If master is None, + the default master is returned if there is one, otherwise a new + master is created and returned. + + If it is not allowed to use the default root and master is None, + RuntimeError is raised.""" + if master is None: + if Tkinter._support_default_root: + master = Tkinter._default_root or Tkinter.Tk() + else: + raise RuntimeError( + "No master specified and Tkinter is " + "configured to not support default root") + return master + def _format_optdict(optdict, script=False, ignore=None): @@ -366,12 +375,11 @@ class Style(object): _name = "ttk::style" def __init__(self, master=None): - if master is None: - if Tkinter._support_default_root: - master = Tkinter._default_root or Tkinter.Tk() - else: - raise RuntimeError("No master specified and Tkinter is " - "configured to not support default master") + master = _setup_master(master) + + if not getattr(master, '_tile_loaded', False): + # Load tile now, if needed + _load_tile(master) self.master = master self.tk = self.master.tk @@ -548,6 +556,10 @@ class Widget(Tkinter.Widget): active, disabled, focus, pressed, selected, background, readonly, alternate, invalid """ + master = _setup_master(master) + if not getattr(master, '_tile_loaded', False): + # Load tile now, if needed + _load_tile(master) Tkinter.Widget.__init__(self, master, widgetname, kw=kw) diff --git a/Lib/test/test_tcl.py b/Lib/test/test_tcl.py index 7690fe10258..26e294ce136 100644 --- a/Lib/test/test_tcl.py +++ b/Lib/test/test_tcl.py @@ -4,15 +4,9 @@ import unittest import os import _tkinter from test import test_support -from Tkinter import Tk, Tcl +from Tkinter import Tcl from _tkinter import TclError -# Restore Tkinter.Tk._loadtk that may have been overridden by ttk. -# If this is not done then this test may fail for reasons related -# to ttk only (like failing to load the tile package). -from ttk import __loadtk__ -Tk._loadtk = __loadtk__ - class TkinterTest(unittest.TestCase):