Convert tcl objects to strings in getvar/setvar. Fixes #730506.
diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c
index c946f88..e1238d6 100644
--- a/Modules/_tkinter.c
+++ b/Modules/_tkinter.c
@@ -742,6 +742,12 @@
 	return PyString_FromString(Tcl_GetString(self->value));
 }
 
+static char*
+PyTclObject_TclString(PyObject *self)
+{
+	return Tcl_GetString(((PyTclObject*)self)->value);
+}
+
 /* Like _str, but create Unicode if necessary. */
 PyDoc_STRVAR(PyTclObject_string__doc__, 
 "the string representation of this object, either as string or Unicode");
@@ -1466,6 +1472,22 @@
 	Tcl_Condition cond;
 } VarEvent;
 
+static int
+varname_converter(PyObject *in, void *_out)
+{
+	char **out = (char**)_out;
+	if (PyString_Check(in)) {
+		*out = PyString_AsString(in);
+		return 1;
+	}
+	if (PyTclObject_Check(in)) {
+		*out = PyTclObject_TclString(in);
+		return 1;
+	}
+	/* XXX: Should give diagnostics. */
+	return 0;
+}	
+
 void
 var_perform(VarEvent *ev)
 {
@@ -1542,7 +1564,8 @@
 	PyObject *res = NULL;
 	Tcl_Obj *newval, *ok;
 
-	if (PyArg_ParseTuple(args, "sO:setvar", &name1, &newValue)) {
+	if (PyArg_ParseTuple(args, "O&O:setvar", 
+			     varname_converter, &name1, &newValue)) {
 		/* XXX Acquire tcl lock??? */
 		newval = AsObj(newValue);
 		if (newval == NULL)
@@ -1604,7 +1627,8 @@
 	PyObject *res = NULL;
 	Tcl_Obj *tres;
 
-	if (!PyArg_ParseTuple(args, "s|s:getvar", &name1, &name2))
+	if (!PyArg_ParseTuple(args, "O&|s:getvar", 
+			      varname_converter, &name1, &name2))
 		return NULL;
 
 	ENTER_TCL