/Lib/lib-tk/FixTk.py
http://unladen-swallow.googlecode.com/ · Python · 76 lines · 54 code · 4 blank · 18 comment · 19 complexity · 475f035510e0d5f1d03112b3c4b6415e MD5 · raw file
- import sys, os
- # Delay import _tkinter until we have set TCL_LIBRARY,
- # so that Tcl_FindExecutable has a chance to locate its
- # encoding directory.
- # Unfortunately, we cannot know the TCL_LIBRARY directory
- # if we don't know the tcl version, which we cannot find out
- # without import Tcl. Fortunately, Tcl will itself look in
- # <TCL_LIBRARY>\..\tcl<TCL_VERSION>, so anything close to
- # the real Tcl library will do.
- # Expand symbolic links on Vista
- try:
- import ctypes
- ctypes.windll.kernel32.GetFinalPathNameByHandleW
- except (ImportError, AttributeError):
- def convert_path(s):
- return s
- else:
- def convert_path(s):
- if isinstance(s, str):
- s = s.decode("mbcs")
- hdir = ctypes.windll.kernel32.\
- CreateFileW(s, 0x80, # FILE_READ_ATTRIBUTES
- 1, # FILE_SHARE_READ
- None, 3, # OPEN_EXISTING
- 0x02000000, # FILE_FLAG_BACKUP_SEMANTICS
- None)
- if hdir == -1:
- # Cannot open directory, give up
- return s
- buf = ctypes.create_unicode_buffer(u"", 32768)
- res = ctypes.windll.kernel32.\
- GetFinalPathNameByHandleW(hdir, buf, len(buf),
- 0) # VOLUME_NAME_DOS
- ctypes.windll.kernel32.CloseHandle(hdir)
- if res == 0:
- # Conversion failed (e.g. network location)
- return s
- s = buf[:res]
- # Ignore leading \\?\
- if s.startswith(u"\\\\?\\"):
- s = s[4:]
- return s
- prefix = os.path.join(sys.prefix,"tcl")
- if not os.path.exists(prefix):
- # devdir/../tcltk/lib
- prefix = os.path.join(sys.prefix, os.path.pardir, "tcltk", "lib")
- prefix = os.path.abspath(prefix)
- # if this does not exist, no further search is needed
- if os.path.exists(prefix):
- prefix = convert_path(prefix)
- if not os.environ.has_key("TCL_LIBRARY"):
- for name in os.listdir(prefix):
- if name.startswith("tcl"):
- tcldir = os.path.join(prefix,name)
- if os.path.isdir(tcldir):
- os.environ["TCL_LIBRARY"] = tcldir
- # Compute TK_LIBRARY, knowing that it has the same version
- # as Tcl
- import _tkinter
- ver = str(_tkinter.TCL_VERSION)
- if not os.environ.has_key("TK_LIBRARY"):
- v = os.path.join(prefix, 'tk'+ver)
- if os.path.exists(os.path.join(v, "tclIndex")):
- os.environ['TK_LIBRARY'] = v
- # We don't know the Tix version, so we must search the entire
- # directory
- if not os.environ.has_key("TIX_LIBRARY"):
- for name in os.listdir(prefix):
- if name.startswith("tix"):
- tixdir = os.path.join(prefix,name)
- if os.path.isdir(tixdir):
- os.environ["TIX_LIBRARY"] = tixdir