diff -r ccffce2dde49 Lib/test/test_tcl.py --- a/Lib/test/test_tcl.py Wed May 29 23:38:00 2013 +0300 +++ b/Lib/test/test_tcl.py Thu May 30 16:31:22 2013 +0300 @@ -175,6 +175,66 @@ self.assertEqual(passValue(f), f) self.assertEqual(passValue((1, '2', (3.4,))), (1, '2', (3.4,))) + def test_splitlist(self): + splitlist = self.interp.tk.splitlist + self.assertRaises(TypeError, splitlist) + self.assertRaises(TypeError, splitlist, 'a', 'b') + self.assertRaises(TypeError, splitlist, 2) + self.assertEqual(splitlist('2'), ('2',)) + self.assertEqual(splitlist(''), ()) + self.assertEqual(splitlist('{}'), ('',)) + self.assertEqual(splitlist('""'), ('',)) + self.assertRaises(TclError, splitlist, '{') + self.assertEqual(splitlist('a\n b\t\r c\n '), ('a', 'b', 'c')) + self.assertEqual(splitlist(b'a\n b\t\r c\n '), ('a', 'b', 'c')) + self.assertEqual(splitlist('a \u20ac'), ('a', '\u20ac')) + self.assertEqual(splitlist(b'a \xe2\x82\xac'), ('a', '\u20ac')) + self.assertEqual(splitlist('a {b c}'), ('a', 'b c')) + self.assertEqual(splitlist(r'a b\ c'), ('a', 'b c')) + self.assertEqual(splitlist(('a', 'b c')), ('a', 'b c')) + self.assertEqual(splitlist('a 2'), ('a', '2')) + self.assertEqual(splitlist(('a', 2)), ('a', 2)) + self.assertEqual(splitlist('a 3.4'), ('a', '3.4')) + self.assertEqual(splitlist(('a', 3.4)), ('a', 3.4)) + self.assertEqual(splitlist(()), ()) + call = self.interp.tk.call + self.assertEqual(splitlist(call('list', 1, '2', (3.4,))), + (1, '2', (3.4,))) + self.assertEqual(splitlist(call('dict', 'create', + 1, '2', b'\xe2\x82\xac', (3.4,))), + (1, '2', '\u20ac', (3.4,))) + + def test_split(self): + split = self.interp.tk.split + self.assertRaises(TypeError, split) + self.assertRaises(TypeError, split, 'a', 'b') + self.assertRaises(TypeError, split, 2) + self.assertEqual(split('2'), '2') + self.assertEqual(split(''), '') + self.assertEqual(split('{}'), '') + self.assertEqual(split('""'), '') + self.assertEqual(split('{'), '{') + self.assertEqual(split('a\n b\t\r c\n '), ('a', 'b', 'c')) + self.assertEqual(split(b'a\n b\t\r c\n '), ('a', 'b', 'c')) + self.assertEqual(split('a \u20ac'), ('a', '\u20ac')) + self.assertEqual(split(b'a \xe2\x82\xac'), ('a', '\u20ac')) + self.assertEqual(split('a {b c}'), ('a', ('b', 'c'))) + self.assertEqual(split(r'a b\ c'), ('a', ('b', 'c'))) + self.assertEqual(split(('a', b'b c')), ('a', ('b', 'c'))) + self.assertEqual(split(('a', 'b c')), ('a', ('b', 'c'))) + self.assertEqual(split('a 2'), ('a', '2')) + self.assertEqual(split(('a', 2)), ('a', 2)) + self.assertEqual(split('a 3.4'), ('a', '3.4')) + self.assertEqual(split(('a', 3.4)), ('a', 3.4)) + self.assertEqual(split(('a', (2, 3.4))), ('a', (2, 3.4))) + self.assertEqual(split(()), ()) + call = self.interp.tk.call + self.assertEqual(split(call('list', 1, '2', (3.4,))), + (1, '2', (3.4,))) + self.assertEqual(split(call('dict', 'create', + 1, '2', b'\xe2\x82\xac', (3.4,))), + (1, '2', '\u20ac', (3.4,))) + def test_main(): support.run_unittest(TclTest, TkinterTest) diff -r ccffce2dde49 Lib/tkinter/__init__.py --- a/Lib/tkinter/__init__.py Wed May 29 23:38:00 2013 +0300 +++ b/Lib/tkinter/__init__.py Thu May 30 16:31:22 2013 +0300 @@ -1352,7 +1352,7 @@ value = words[i+1] if not value: value = None - elif '.' in value: + elif '.' in str(value): value = getdouble(value) else: value = getint(value) @@ -1921,7 +1921,7 @@ for i in range(0, len(words), 2): key = words[i][1:] value = words[i+1] - if value[:1] == '.': + if str(value)[:1] == '.': value = self._nametowidget(value) dict[key] = value return dict @@ -1972,7 +1972,7 @@ for i in range(0, len(words), 2): key = words[i][1:] value = words[i+1] - if value[:1] == '.': + if str(value)[:1] == '.': value = self._nametowidget(value) dict[key] = value return dict diff -r ccffce2dde49 Lib/tkinter/test/test_ttk/test_widgets.py --- a/Lib/tkinter/test/test_ttk/test_widgets.py Wed May 29 23:38:00 2013 +0300 +++ b/Lib/tkinter/test/test_ttk/test_widgets.py Thu May 30 16:31:22 2013 +0300 @@ -105,7 +105,7 @@ cbtn['command'] = '' res = cbtn.invoke() - self.assertEqual(res, '') + self.assertEqual(str(res), '') self.assertFalse(len(success) > 1) self.assertEqual(cbtn['offvalue'], cbtn.tk.globalgetvar(cbtn['variable'])) @@ -453,7 +453,7 @@ cbtn2['command'] = '' res = cbtn2.invoke() - self.assertEqual(res, '') + self.assertEqual(str(res), '') self.assertFalse(len(success) > 1) self.assertEqual(cbtn2['value'], myvar.get()) self.assertEqual(myvar.get(), diff -r ccffce2dde49 Modules/_tkinter.c --- a/Modules/_tkinter.c Wed May 29 23:38:00 2013 +0300 +++ b/Modules/_tkinter.c Thu May 30 16:31:22 2013 +0300 @@ -423,6 +423,21 @@ return result; /* Fall through, returning arg. */ } + else if (PyUnicode_Check(arg)) { + int argc; + char **argv; + char *list = PyUnicode_AsUTF8(arg); + + if (list == NULL || + Tcl_SplitList((Tcl_Interp *)NULL, list, &argc, &argv) != TCL_OK) { + Py_INCREF(arg); + return arg; + } + Tcl_Free(FREECAST argv); + if (argc > 1) + return Split(list); + /* Fall through, returning arg. */ + } else if (PyBytes_Check(arg)) { int argc; char **argv; @@ -1721,16 +1736,35 @@ char *list; int argc; char **argv; - PyObject *v; + PyObject *arg, *v; int i; - if (PyTuple_Size(args) == 1) { - v = PyTuple_GetItem(args, 0); - if (PyTuple_Check(v)) { - Py_INCREF(v); - return v; + if (!PyArg_ParseTuple(args, "O:splitlist", &arg)) + return NULL; + if (PyTclObject_Check(arg)) { + int objc; + Tcl_Obj **objv; + if (Tcl_ListObjGetElements(Tkapp_Interp(self), + ((PyTclObject*)arg)->value, + &objc, &objv) == TCL_ERROR) { + return Tkinter_Error(self); } + if (!(v = PyTuple_New(objc))) + return NULL; + for (i = 0; i < objc; i++) { + PyObject *s = FromObj(self, objv[i]); + if (!s || PyTuple_SetItem(v, i, s)) { + Py_DECREF(v); + return NULL; + } + } + return v; } + if (PyTuple_Check(arg)) { + Py_INCREF(arg); + return arg; + } + if (!PyArg_ParseTuple(args, "et:splitlist", "utf-8", &list)) return NULL; @@ -1761,16 +1795,38 @@ static PyObject * Tkapp_Split(PyObject *self, PyObject *args) { - PyObject *v; + PyObject *arg, *v; char *list; - if (PyTuple_Size(args) == 1) { - PyObject* o = PyTuple_GetItem(args, 0); - if (PyTuple_Check(o)) { - o = SplitObj(o); - return o; + if (!PyArg_ParseTuple(args, "O:split", &arg)) + return NULL; + if (PyTclObject_Check(arg)) { + Tcl_Obj *value = ((PyTclObject*)arg)->value; + int objc; + Tcl_Obj **objv; + int i; + if (Tcl_ListObjGetElements(Tkapp_Interp(self), value, + &objc, &objv) == TCL_ERROR) { + return FromObj(self, value); } + if (objc == 0) + return PyUnicode_FromString(""); + if (objc == 1) + return FromObj(self, objv[0]); + if (!(v = PyTuple_New(objc))) + return NULL; + for (i = 0; i < objc; i++) { + PyObject *s = FromObj(self, objv[i]); + if (!s || PyTuple_SetItem(v, i, s)) { + Py_DECREF(v); + return NULL; + } + } + return v; } + if (PyTuple_Check(arg)) + return SplitObj(arg); + if (!PyArg_ParseTuple(args, "et:split", "utf-8", &list)) return NULL; v = Split(list);