Gracefully delay runtime error up to 1s. Add .willdispatch().
diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c
index 492198e..1122631 100644
--- a/Modules/_tkinter.c
+++ b/Modules/_tkinter.c
@@ -310,6 +310,24 @@
 #endif /* MS_WINDOWS */
 #endif /* WITH_THREAD */
 
+/* Wait up to 1s for the mainloop to come up. */
+
+static int
+WaitForMainloop(TkappObject* self)
+{
+	int i;
+	for (i = 0; i < 10; i++) {
+		if (self->dispatching)
+			return 1;
+		Py_BEGIN_ALLOW_THREADS
+		Sleep(100);
+		Py_END_ALLOW_THREADS
+	}
+	if (self->dispatching)
+		return 1;
+	PyErr_SetString(PyExc_RuntimeError, "main thread is not in main loop");
+	return 0;
+}
 
 
 static char *
@@ -1138,11 +1156,8 @@
 		   marshal the parameters to the interpreter thread. */
 		Tkapp_CallEvent *ev;
 		PyObject *exc_type, *exc_value, *exc_tb;
-		if (!self->dispatching) {
-			PyErr_SetString(PyExc_RuntimeError,
-					"main thread is not in main loop");
+		if (!WaitForMainloop(self))
 			return NULL;
-		}
 		ev = (Tkapp_CallEvent*)ckalloc(sizeof(Tkapp_CallEvent));
 		ev->ev.proc = (Tcl_EventProc*)Tkapp_CallProc;
 		ev->self = self;
@@ -1427,11 +1442,8 @@
 		   the call to the interpreter thread, then wait for
 		   completion. */
 
-		if (!self->dispatching) {
-			PyErr_SetString(PyExc_RuntimeError, 
-					"main thread is not in main loop");
+		if (!WaitForMainloop(self))
 			return NULL;
-		}
 		ev->cond = NULL;
 		ev->ev.proc = (Tcl_EventProc*)var_proc;
 		Tkapp_ThreadSend(self, (Tcl_Event*)ev, &ev->cond, &var_mutex);
@@ -1943,11 +1955,8 @@
 	}
 
 	if (self->threaded && self->thread_id != Tcl_GetCurrentThread() &&
-	    !self->dispatching) {
-		PyErr_SetString(PyExc_RuntimeError, 
-				"main thread is not in main loop");
+	    !WaitForMainloop(self))
 		return NULL;
-	}
 
 	data = PyMem_NEW(PythonCmd_ClientData, 1);
 	if (!data)
@@ -2423,12 +2432,22 @@
 	return Py_None;
 }
 
+static PyObject *
+Tkapp_WillDispatch(PyObject *self, PyObject *args)
+{
+
+	((TkappObject*)self)->dispatching = 1;
+
+	Py_INCREF(Py_None);
+	return Py_None;
+}
 
 
 /**** Tkapp Method List ****/
 
 static PyMethodDef Tkapp_methods[] =
 {
+	{"willdispatch",       Tkapp_WillDispatch, METH_NOARGS},
 	{"wantobjects",	       Tkapp_WantObjects, METH_VARARGS},
 	{"call", 	       Tkapp_Call, METH_OLDARGS},
 	{"globalcall", 	       Tkapp_GlobalCall, METH_OLDARGS},