diff -r 20225460ae0f Lib/test/test_tcl.py --- a/Lib/test/test_tcl.py Mon Jun 09 16:41:27 2014 -0400 +++ b/Lib/test/test_tcl.py Mon Jun 09 22:42:44 2014 -0500 @@ -6,9 +6,6 @@ # Skip this test if the _tkinter module wasn't built. _tkinter = support.import_module('_tkinter') -# Make sure tkinter._fix runs to set up the environment -support.import_fresh_module('tkinter') - from tkinter import Tcl from _tkinter import TclError diff -r 20225460ae0f Lib/test/test_tk.py --- a/Lib/test/test_tk.py Mon Jun 09 16:41:27 2014 -0400 +++ b/Lib/test/test_tk.py Mon Jun 09 22:42:44 2014 -0500 @@ -2,9 +2,6 @@ # Skip test if _tkinter wasn't built. support.import_module('_tkinter') -# Make sure tkinter._fix runs to set up the environment -support.import_fresh_module('tkinter') - # Skip test if tk cannot be initialized. support.requires('gui') diff -r 20225460ae0f Lib/test/test_ttk_guionly.py --- a/Lib/test/test_ttk_guionly.py Mon Jun 09 16:41:27 2014 -0400 +++ b/Lib/test/test_ttk_guionly.py Mon Jun 09 22:42:44 2014 -0500 @@ -5,9 +5,6 @@ # Skip this test if _tkinter wasn't built. support.import_module('_tkinter') -# Make sure tkinter._fix runs to set up the environment -support.import_fresh_module('tkinter') - # Skip test if tk cannot be initialized. support.requires('gui') diff -r 20225460ae0f Lib/test/test_ttk_textonly.py --- a/Lib/test/test_ttk_textonly.py Mon Jun 09 16:41:27 2014 -0400 +++ b/Lib/test/test_ttk_textonly.py Mon Jun 09 22:42:44 2014 -0500 @@ -4,9 +4,6 @@ # Skip this test if _tkinter does not exist. support.import_module('_tkinter') -# Make sure tkinter._fix runs to set up the environment -support.import_fresh_module('tkinter') - from tkinter.test import runtktests def test_main(): diff -r 20225460ae0f Lib/tkinter/__init__.py --- a/Lib/tkinter/__init__.py Mon Jun 09 16:41:27 2014 -0400 +++ b/Lib/tkinter/__init__.py Mon Jun 09 22:42:44 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 20225460ae0f Lib/tkinter/_fix.py --- a/Lib/tkinter/_fix.py Mon Jun 09 16:41:27 2014 -0400 +++ /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 20225460ae0f Modules/_tkinter.c --- a/Modules/_tkinter.c Mon Jun 09 16:41:27 2014 -0400 +++ b/Modules/_tkinter.c Mon Jun 09 22:42:44 2014 -0500 @@ -108,7 +108,59 @@ #ifdef MS_WINDOWS #include #define WAIT_FOR_STDIN -#endif + +#ifdef MS_WIN64 +#define Py_TCLTK_DIR "tcltk64" +#else +#define Py_TCLTK_DIR "tcltk" +#endif /* MS_WIN64 */ + +static PyObject * +_get_tcl_lib_path() +{ + static PyObject *tcl_library_path = NULL; + static int already_checked = 0; + + if (already_checked == 0) { + PyObject *prefix; + struct _stat stat_buf; + wchar_t *wchar_lib_path; + + prefix = PyUnicode_FromWideChar(Py_GetPrefix(), -1); + if (prefix == NULL) { + return NULL; + } + + /* Check expected location for an installed Python first */ + tcl_library_path = PyUnicode_Concat(prefix, + PyUnicode_FromString( + "\\tcl\\tcl" TCL_VERSION)); + + wchar_lib_path = PyUnicode_AsWideCharString(tcl_library_path, NULL); + + if (_wstat(wchar_lib_path, &stat_buf) == -1) { + /* install location doesn't exist, reset errno and see if + we're a repository build */ + errno = 0; + tcl_library_path = PyUnicode_Concat(prefix, + PyUnicode_FromString( + "\\..\\" Py_TCLTK_DIR + "\\lib\\tcl" TCL_VERSION)); + wchar_lib_path = PyUnicode_AsWideCharString(tcl_library_path, NULL); + if (_wstat(wchar_lib_path, &stat_buf) == -1) { + /* tcltkDir for a repository build doesn't exist either, + reset errno and leave Tcl to its own devices */ + errno = 0; + tcl_library_path = NULL; + } + } + PyMem_Free(wchar_lib_path); + already_checked = 1; + } + return tcl_library_path; +} +#undef Py_TCLTK_DIR +#endif /* MS_WINDOWS */ #ifdef WITH_THREAD @@ -671,6 +723,30 @@ ckfree(args); } +#ifdef MS_WINDOWS + { + PyObject *str_path; + PyObject *utf8_path; + DWORD ret; + + ret = GetEnvironmentVariableW(L"TCL_LIBRARY", NULL, 0); + if (!ret && GetLastError() == ERROR_ENVVAR_NOT_FOUND) { + str_path = _get_tcl_lib_path(); + if (str_path != NULL) { + utf8_path = PyUnicode_AsUTF8String(str_path); + if (utf8_path == NULL) { + return NULL; + } + Tcl_SetVar(v->interp, + "tcl_library", + PyBytes_AsString(utf8_path), + TCL_GLOBAL_ONLY); + Py_DECREF(utf8_path); + } + } + } +#endif + if (Tcl_AppInit(v->interp) != TCL_OK) { PyObject *result = Tkinter_Error((PyObject *)v); #ifdef TKINTER_PROTECT_LOADTK @@ -3115,8 +3191,41 @@ uexe = PyUnicode_FromWideChar(Py_GetProgramName(), -1); if (uexe) { cexe = PyUnicode_EncodeFSDefault(uexe); - if (cexe) + if (cexe) { +#ifdef MS_WINDOWS + int set_var = 0; + PyObject *str_path; + wchar_t *wcs_path; + DWORD ret; + + ret = GetEnvironmentVariableW(L"TCL_LIBRARY", NULL, 0); + + if (!ret && GetLastError() == ERROR_ENVVAR_NOT_FOUND) { + str_path = _get_tcl_lib_path(); + if (str_path != NULL) { + wcs_path = PyUnicode_AsWideCharString(str_path, NULL); + if (wcs_path == NULL) { + return NULL; + } + SetEnvironmentVariableW(L"TCL_LIBRARY", wcs_path); + PyMem_Free(wcs_path); + set_var = 1; + } else { + if (PyErr_Occurred()) { + return NULL; + } + } + } + Tcl_FindExecutable(PyBytes_AsString(cexe)); + + if (set_var) { + SetEnvironmentVariableW(L"TCL_LIBRARY", NULL); + } +#else + Tcl_FindExecutable(PyBytes_AsString(cexe)); +#endif /* MS_WINDOWS */ + } Py_XDECREF(cexe); Py_DECREF(uexe); } diff -r 20225460ae0f PCbuild/rt.bat --- a/PCbuild/rt.bat Mon Jun 09 16:41:27 2014 -0400 +++ b/PCbuild/rt.bat Mon Jun 09 22:42:44 2014 -0500 @@ -30,15 +30,13 @@ set suffix= set qmode= set dashO= -set tcltk=tcltk :CheckOpts if "%1"=="-O" (set dashO=-O) & shift & goto CheckOpts if "%1"=="-q" (set qmode=yes) & shift & goto CheckOpts if "%1"=="-d" (set suffix=_d) & shift & goto CheckOpts -if "%1"=="-x64" (set prefix=amd64) & (set tcltk=tcltk64) & shift & goto CheckOpts +if "%1"=="-x64" (set prefix=amd64) & shift & goto CheckOpts -PATH %PATH%;%~dp0..\..\%tcltk%\bin set exe=%prefix%\python%suffix% set cmd=%exe% %dashO% -Wd -E -bb ../lib/test/regrtest.py %1 %2 %3 %4 %5 %6 %7 %8 %9 if defined qmode goto Qmode diff -r 20225460ae0f Tools/buildbot/test-amd64.bat --- a/Tools/buildbot/test-amd64.bat Mon Jun 09 16:41:27 2014 -0400 +++ b/Tools/buildbot/test-amd64.bat Mon Jun 09 22:42:44 2014 -0500 @@ -1,6 +1,3 @@ @rem Used by the buildbot "test" step. - -rem The following line should be removed before #20035 is closed -set TCL_LIBRARY=%CD%\..\tcltk64\lib\tcl8.6 cd PCbuild call rt.bat -d -q -x64 -uall -rwW -n --timeout=3600 %1 %2 %3 %4 %5 %6 %7 %8 %9 diff -r 20225460ae0f Tools/buildbot/test.bat --- a/Tools/buildbot/test.bat Mon Jun 09 16:41:27 2014 -0400 +++ b/Tools/buildbot/test.bat Mon Jun 09 22:42:44 2014 -0500 @@ -1,6 +1,3 @@ @rem Used by the buildbot "test" step. - -rem The following line should be removed before #20035 is closed -set TCL_LIBRARY=%CD%\..\tcltk\lib\tcl8.6 cd PCbuild call rt.bat -d -q -uall -rwW -n --timeout=3600 %1 %2 %3 %4 %5 %6 %7 %8 %9