Darn.  When thread support is disabled, the BEGIN/END macros don't
save and restore the tstate, but explicitly calling
PyEval_SaveThread() does reset it!  While I think about how to fix
this for real, here's a fix that avoids getting a fatal error.
diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c
index 593b057..5958716 100644
--- a/Modules/_tkinter.c
+++ b/Modules/_tkinter.c
@@ -1456,14 +1456,15 @@
 static int
 EventHook()
 {
-	PyThreadState *tstate;
+	PyThreadState *tstate, *save_tstate;
 
 	if (Tk_GetNumMainWindows() == 0)
 		return 0;
 	if (event_interp == NULL)
 		return 0;
 	tstate = PyThreadState_New(event_interp);
-	PyEval_AcquireThread(tstate);
+	save_tstate = PyThreadState_Swap(NULL);
+	PyEval_RestoreThread(tstate);
 	if (!errorInCmd)
 		Tcl_DoOneEvent(TCL_DONT_WAIT);
 	if (errorInCmd) {
@@ -1473,7 +1474,8 @@
 		PyErr_Print();
 	}
 	PyThreadState_Clear(tstate);
-	PyEval_ReleaseThread(tstate);
+	PyEval_SaveThread();
+	PyThreadState_Swap(save_tstate);
 	PyThreadState_Delete(tstate);
 	return 0;
 }
@@ -1536,7 +1538,6 @@
 	PyDict_SetItemString(d, "TkttType", (PyObject *)&Tktt_Type);
 
 	if (PyOS_InputHook == NULL) {
-		PyEval_InitThreads();
 		event_interp = PyThreadState_Get()->interp;
 		PyOS_InputHook = EventHook;
 	}