diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c index e153047b778..02f5d12db1a 100644 --- a/Modules/_tkinter.c +++ b/Modules/_tkinter.c @@ -115,6 +115,7 @@ Copyright (C) 1994 Steen Lumholt. #ifdef MS_WINDOWS #include #define WAIT_FOR_STDIN +#endif static PyObject * _get_tcl_lib_path() @@ -132,6 +133,7 @@ _get_tcl_lib_path() return NULL; } +#ifdef MS_WINDOWS /* Check expected location for an installed Python first */ tcl_library_path = PyUnicode_FromString("\\tcl\\tcl" TCL_VERSION); if (tcl_library_path == NULL) { @@ -169,11 +171,31 @@ _get_tcl_lib_path() tcl_library_path = NULL; #endif } +#else + /* Check expected location for an installed Python first */ + tcl_library_path = PyUnicode_FromString("/lib/tcl" TCL_VERSION); + if (tcl_library_path == NULL) { + return NULL; + } + tcl_library_path = PyUnicode_Concat(prefix, tcl_library_path); + if (tcl_library_path == NULL) { + return NULL; + } + stat_return_value = _Py_stat(tcl_library_path, &stat_buf); + if (stat_return_value == -2) { + return NULL; + } + if (stat_return_value == -1) { + /* install location doesn't exist, reset errno and leave Tcl + to its own devices */ + errno = 0; + tcl_library_path = NULL; + } +#endif already_checked = 1; } return tcl_library_path; } -#endif /* MS_WINDOWS */ /* The threading situation is complicated. Tcl is not thread-safe, except when configured with --enable-threads. @@ -822,6 +844,30 @@ Tkapp_New(const char *screenName, const char *className, ret = GetEnvironmentVariableW(L"TCL_LIBRARY", NULL, 0); if (!ret && GetLastError() == ERROR_ENVVAR_NOT_FOUND) { + str_path = _get_tcl_lib_path(); + if (str_path == NULL && PyErr_Occurred()) { + return NULL; + } + if (str_path != NULL) { + utf8_path = PyUnicode_AsUTF8String(str_path); + if (utf8_path == NULL) { + return NULL; + } + Tcl_SetVar(v->interp, + "tcl_library", + PyBytes_AS_STRING(utf8_path), + TCL_GLOBAL_ONLY); + Py_DECREF(utf8_path); + } + } + } +#else + { + const char *env_val = getenv("TCL_LIBRARY"); + if (!env_val) { + PyObject *str_path; + PyObject *utf8_path; + str_path = _get_tcl_lib_path(); if (str_path == NULL && PyErr_Occurred()) { return NULL; @@ -3631,7 +3677,32 @@ PyInit__tkinter(void) PyMem_Free(wcs_path); } #else + int set_var = 0; + PyObject *str_path; + char *path; + + if (!getenv("TCL_LIBRARY")) { + str_path = _get_tcl_lib_path(); + if (str_path == NULL && PyErr_Occurred()) { + Py_DECREF(m); + return NULL; + } + if (str_path != NULL) { + path = PyUnicode_AsUTF8(str_path); + if (path == NULL) { + Py_DECREF(m); + return NULL; + } + setenv("TCL_LIBRARY", path, 1); + set_var = 1; + } + } + Tcl_FindExecutable(PyBytes_AS_STRING(cexe)); + + if (set_var) { + unsetenv("TCL_LIBRARY"); + } #endif /* MS_WINDOWS */ } Py_XDECREF(cexe);