summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuilherme Polo <ggpolo@gmail.com>2009-02-07 02:20:29 (GMT)
committerGuilherme Polo <ggpolo@gmail.com>2009-02-07 02:20:29 (GMT)
commit8e5e438d215f88e586a34fcb7fe867b34852215f (patch)
tree0ac1d2420188955958266ec1d6c045a63f1a1507
parent92c3b2190bae6dd7844c83b6acefc0b89d2bc225 (diff)
downloadcpython-8e5e438d215f88e586a34fcb7fe867b34852215f.zip
cpython-8e5e438d215f88e586a34fcb7fe867b34852215f.tar.gz
cpython-8e5e438d215f88e586a34fcb7fe867b34852215f.tar.bz2
Eliminated the need to use ttk.__loadtk__ and the problems related it.
-rw-r--r--Lib/lib-tk/ttk.py70
-rw-r--r--Lib/test/test_tcl.py8
2 files changed, 42 insertions, 36 deletions
diff --git a/Lib/lib-tk/ttk.py b/Lib/lib-tk/ttk.py
index 43da726..c2907c9 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)
-
- 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
+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
-# 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 _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 7690fe1..26e294c 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):