From fa8fba96a6af233d36cbe9b3d42832d6f071e50b Mon Sep 17 00:00:00 2001 From: Guilherme Polo Date: Sat, 7 Feb 2009 02:33:47 +0000 Subject: Merged revisions 69404 via svnmerge from svn+ssh://pythondev/python/trunk ........ r69404 | guilherme.polo | 2009-02-07 00:20:29 -0200 (Sat, 07 Feb 2009) | 2 lines Eliminated the need to use ttk.__loadtk__ and the problems related it. ........ --- Lib/test/test_tcl.py | 8 +----- Lib/tkinter/ttk.py | 71 ++++++++++++++++++++++++++++++---------------------- 2 files changed, 42 insertions(+), 37 deletions(-) diff --git a/Lib/test/test_tcl.py b/Lib/test/test_tcl.py index fa20188..fa1727c 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 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 tkinter.ttk import __loadtk__ -Tk._loadtk = __loadtk__ - class TkinterTest(unittest.TestCase): diff --git a/Lib/tkinter/ttk.py b/Lib/tkinter/ttk.py index 82420aa..89a9bf1 100644 --- a/Lib/tkinter/ttk.py +++ b/Lib/tkinter/ttk.py @@ -29,32 +29,40 @@ 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) - - 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 - - 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 _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) + + master.tk.eval('package require tile') # TclError may be raised here + master._tile_loaded = True + + +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 +374,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 +555,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) -- cgit v0.12