• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 import sys, os
2 
3 # Delay import _tkinter until we have set TCL_LIBRARY,
4 # so that Tcl_FindExecutable has a chance to locate its
5 # encoding directory.
6 
7 # Unfortunately, we cannot know the TCL_LIBRARY directory
8 # if we don't know the tcl version, which we cannot find out
9 # without import Tcl. Fortunately, Tcl will itself look in
10 # <TCL_LIBRARY>\..\tcl<TCL_VERSION>, so anything close to
11 # the real Tcl library will do.
12 
13 # Expand symbolic links on Vista
14 try:
15     import ctypes
16     ctypes.windll.kernel32.GetFinalPathNameByHandleW
17 except (ImportError, AttributeError):
18     def convert_path(s):
19         return s
20 else:
21     def convert_path(s):
22         assert isinstance(s, str)   # sys.prefix contains only bytes
23         udir = s.decode("mbcs")
24         hdir = ctypes.windll.kernel32.\
25             CreateFileW(udir, 0x80, # FILE_READ_ATTRIBUTES
26                         1,          # FILE_SHARE_READ
27                         None, 3,    # OPEN_EXISTING
28                         0x02000000, # FILE_FLAG_BACKUP_SEMANTICS
29                         None)
30         if hdir == -1:
31             # Cannot open directory, give up
32             return s
33         buf = ctypes.create_unicode_buffer(u"", 32768)
34         res = ctypes.windll.kernel32.\
35             GetFinalPathNameByHandleW(hdir, buf, len(buf),
36                                       0) # VOLUME_NAME_DOS
37         ctypes.windll.kernel32.CloseHandle(hdir)
38         if res == 0:
39             # Conversion failed (e.g. network location)
40             return s
41         s = buf[:res].encode("mbcs")
42         # Ignore leading \\?\
43         if s.startswith("\\\\?\\"):
44             s = s[4:]
45         if s.startswith("UNC"):
46             s = "\\" + s[3:]
47         return s
48 
49 prefix = os.path.join(sys.prefix,"tcl")
50 if not os.path.exists(prefix):
51     # devdir/externals/tcltk/lib
52     tcltk = 'tcltk'
53     if sys.maxsize > 2**31 - 1:
54         tcltk = 'tcltk64'
55     prefix = os.path.join(sys.prefix, "externals", tcltk, "lib")
56     prefix = os.path.abspath(prefix)
57 # if this does not exist, no further search is needed
58 if os.path.exists(prefix):
59     prefix = convert_path(prefix)
60     if "TCL_LIBRARY" not in os.environ:
61         for name in os.listdir(prefix):
62             if name.startswith("tcl"):
63                 tcldir = os.path.join(prefix,name)
64                 if os.path.isdir(tcldir):
65                     os.environ["TCL_LIBRARY"] = tcldir
66     # Compute TK_LIBRARY, knowing that it has the same version
67     # as Tcl
68     import _tkinter
69     ver = str(_tkinter.TCL_VERSION)
70     if "TK_LIBRARY" not in os.environ:
71         v = os.path.join(prefix, 'tk'+ver)
72         if os.path.exists(os.path.join(v, "tclIndex")):
73             os.environ['TK_LIBRARY'] = v
74     # We don't know the Tix version, so we must search the entire
75     # directory
76     if "TIX_LIBRARY" not in os.environ:
77         for name in os.listdir(prefix):
78             if name.startswith("tix"):
79                 tixdir = os.path.join(prefix,name)
80                 if os.path.isdir(tixdir):
81                     os.environ["TIX_LIBRARY"] = tixdir
82