_fix.py 2.76 KB
Newer Older
1
import sys, os
2

3 4 5 6 7 8 9 10 11 12
# 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.

13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
# 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, bytes):
            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("", 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("\\\\?\\"):
            s = s[4:]
        return s

47
prefix = os.path.join(sys.prefix,"tcl")
48 49 50 51
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)
52 53
# if this does not exist, no further search is needed
if os.path.exists(prefix):
54
    prefix = convert_path(prefix)
55
    if "TCL_LIBRARY" not in os.environ:
56 57 58 59 60
        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
61 62
    # Compute TK_LIBRARY, knowing that it has the same version
    # as Tcl
63 64
    import _tkinter
    ver = str(_tkinter.TCL_VERSION)
65
    if "TK_LIBRARY" not in os.environ:
66 67 68 69 70
        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
71
    if "TIX_LIBRARY" not in os.environ:
72 73 74 75 76
        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