diff -r ef9d42b98a3d Lib/test/test_tcl.py --- a/Lib/test/test_tcl.py Tue May 28 22:46:51 2013 +0300 +++ b/Lib/test/test_tcl.py Thu May 30 17:14:36 2013 +0300 @@ -184,6 +184,60 @@ 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(u'a\n b\t\r c\n '), ('a', 'b', 'c')) + self.assertEqual(splitlist('a \xe2\x82\xac'), ('a', '\xe2\x82\xac')) + self.assertEqual(splitlist(u'a \u20ac'), ('a', '\xe2\x82\xac')) + 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,))) + + 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(u'a\n b\t\r c\n '), ('a', 'b', 'c')) + self.assertEqual(split('a \xe2\x82\xac'), ('a', '\xe2\x82\xac')) + self.assertEqual(split(u'a \u20ac'), ('a', '\xe2\x82\xac')) + self.assertEqual(split('a {b c}'), ('a', ('b', 'c'))) + self.assertEqual(split(r'a b\ c'), ('a', ('b', 'c'))) + self.assertEqual(split(('a', 'b c')), ('a', ('b', 'c'))) + self.assertEqual(split(('a', u'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,))) + def test_main(): test_support.run_unittest(TclTest, TkinterTest) diff -r ef9d42b98a3d Modules/_tkinter.c --- a/Modules/_tkinter.c Tue May 28 22:46:51 2013 +0300 +++ b/Modules/_tkinter.c Thu May 30 17:14:36 2013 +0300 @@ -547,6 +547,33 @@ return Split(PyString_AsString(arg)); /* Fall through, returning arg. */ } + else if (PyUnicode_Check(arg)) { + int argc; + char **argv; + char *list; + PyObject *s = PyUnicode_AsUTF8String(arg); + + if (s == NULL) { + Py_INCREF(arg); + return arg; + } + list = PyString_AsString(s); + + if (list == NULL || + Tcl_SplitList((Tcl_Interp *)NULL, list, &argc, &argv) != TCL_OK) { + Py_DECREF(s); + Py_INCREF(arg); + return arg; + } + Tcl_Free(FREECAST argv); + if (argc > 1) { + PyObject *v = Split(list); + Py_DECREF(s); + return v; + } + Py_DECREF(s); + /* Fall through, returning arg. */ + } Py_INCREF(arg); return arg; }