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:56:35 2013 +0300 @@ -175,6 +175,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(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,))) + + 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,))) + def test_main(): support.run_unittest(TclTest, TkinterTest) 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:56:35 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;