diff -r c12cc78d59c1 Lib/tkinter/__init__.py --- a/Lib/tkinter/__init__.py Sat Mar 22 00:36:25 2014 -0500 +++ b/Lib/tkinter/__init__.py Sat Mar 22 01:33:37 2014 -0500 @@ -31,9 +31,6 @@ """ import sys -if sys.platform == "win32": - # Attempt to configure Tcl/Tk without requiring PATH - from tkinter import _fix import _tkinter # If this fails your Python may not be configured for Tk TclError = _tkinter.TclError diff -r c12cc78d59c1 Lib/tkinter/_fix.py --- a/Lib/tkinter/_fix.py Sat Mar 22 00:36:25 2014 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,78 +0,0 @@ -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, 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, 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:] - if s.startswith("UNC"): - s = "\\" + s[3:] - return s - -prefix = os.path.join(sys.base_prefix,"tcl") -if not os.path.exists(prefix): - # devdir/../tcltk/lib - prefix = os.path.join(sys.base_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 "TCL_LIBRARY" not in os.environ: - 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 "TK_LIBRARY" not in os.environ: - 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 "TIX_LIBRARY" not in os.environ: - 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 diff -r c12cc78d59c1 Modules/_tkinter.c --- a/Modules/_tkinter.c Sat Mar 22 00:36:25 2014 -0500 +++ b/Modules/_tkinter.c Sat Mar 22 01:33:37 2014 -0500 @@ -651,6 +651,63 @@ ckfree(args); } +#ifdef MS_WINDOWS + +#ifdef MS_WIN64 +#define Py_TCLTK_DIR L"tcltk64" +#else +#define Py_TCLTK_DIR L"tcltk" +#endif + + /* XXX Something to consider: Py_GETENV instead of getenv to respect -E? + Would have to set TK/TIX_LIBRARY as well, though + */ + if (getenv("TCL_LIBRARY") == NULL) { + wchar_t *prefix = Py_GetPrefix(); + struct _stat stat_buf; + char tcl_library[MAX_PATH + 25]; /* extra space for e.g. */ + wchar_t w_tcl_library[MAX_PATH + 25]; /* "\..\tcltk64\lib\tcl8.6" */ + int found_lib = 0; + wchar_t wide_tcl_ver[4]; + + mbstowcs(wide_tcl_ver, TCL_VERSION, 4); + + w_tcl_library[0] = L'\0'; + + wcscat(w_tcl_library, prefix); + wcscat(w_tcl_library, L"\\tcl\\tcl"); + wcscat(w_tcl_library, wide_tcl_ver); + + if (_wstat(w_tcl_library, &stat_buf) == -1) { + /* \tcl\tcl8.6 doesn't exist, reset errno and see if + we're a repository build */ + errno = 0; + w_tcl_library[wcslen(prefix)] = L'\0'; + wcscat(w_tcl_library, + L"\\..\\" Py_TCLTK_DIR L"\\lib\\tcl"); + wcscat(w_tcl_library, wide_tcl_ver); + + if (_wstat(w_tcl_library, &stat_buf) == -1) + /* tcltkDir for a repository build doesn't exist either, + reset errno and leave Tcl to its own devices */ + errno = 0; + else + found_lib = 1; + } else + /* looks like we're installed */ + found_lib = 1; + + if (found_lib) { + wcstombs(tcl_library, w_tcl_library, wcslen(w_tcl_library) + 1); + Tcl_SetVar(v->interp, + "tcl_library", + tcl_library, + TCL_GLOBAL_ONLY); + } + } +#undef Py_TCLTK_DIR +#endif /* MS_WINDOWS */ + if (Tcl_AppInit(v->interp) != TCL_OK) { PyObject *result = Tkinter_Error((PyObject *)v); #ifdef TKINTER_PROTECT_LOADTK