Skip to content

Commit 5bb5bbf

Browse files
bpo-33974: Fix passing special characters to ttk widgets. (GH-7986)
Fix passing lists and tuples of strings containing special characters '"', '\\', '{', '}' and '\n' as options to tkinter.ttk widgets.
1 parent f874bd1 commit 5bb5bbf

File tree

3 files changed

+44
-1
lines changed

3 files changed

+44
-1
lines changed

Lib/test/test_tcl.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -649,6 +649,43 @@ def test_splitdict(self):
649649
expected = {'a': (1, 2, 3), 'something': 'foo', 'status': ''}
650650
self.assertEqual(splitdict(tcl, arg), expected)
651651

652+
def test_join(self):
653+
join = tkinter._join
654+
tcl = self.interp.tk
655+
def unpack(s):
656+
return tcl.call('lindex', s, 0)
657+
def check(value):
658+
self.assertEqual(unpack(join([value])), value)
659+
self.assertEqual(unpack(join([value, 0])), value)
660+
self.assertEqual(unpack(unpack(join([[value]]))), value)
661+
self.assertEqual(unpack(unpack(join([[value, 0]]))), value)
662+
self.assertEqual(unpack(unpack(join([[value], 0]))), value)
663+
self.assertEqual(unpack(unpack(join([[value, 0], 0]))), value)
664+
check('')
665+
check('spam')
666+
check('sp am')
667+
check('sp\tam')
668+
check('sp\nam')
669+
check(' \t\n')
670+
check('{spam}')
671+
check('{sp am}')
672+
check('"spam"')
673+
check('"sp am"')
674+
check('{"spam"}')
675+
check('"{spam}"')
676+
check('sp\\am')
677+
check('"sp\\am"')
678+
check('"{}" "{}"')
679+
check('"\\')
680+
check('"{')
681+
check('"}')
682+
check('\n\\')
683+
check('\n{')
684+
check('\n}')
685+
check('\\\n')
686+
check('{\n')
687+
check('}\n')
688+
652689
def test_new_tcl_obj(self):
653690
self.assertRaises(TypeError, _tkinter.Tcl_Obj)
654691

Lib/tkinter/__init__.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ def _stringify(value):
6161
if isinstance(value, (list, tuple)):
6262
if len(value) == 1:
6363
value = _stringify(value[0])
64-
if value[0] == '{':
64+
if _magic_re.search(value):
6565
value = '{%s}' % value
6666
else:
6767
value = '{%s}' % _join(value)
@@ -72,7 +72,10 @@ def _stringify(value):
7272
elif _magic_re.search(value):
7373
# add '\' before special characters and spaces
7474
value = _magic_re.sub(r'\\\1', value)
75+
value = value.replace('\n', r'\n')
7576
value = _space_re.sub(r'\\\1', value)
77+
if value[0] == '"':
78+
value = '\\' + value
7679
elif value[0] == '"' or _space_re.search(value):
7780
value = '{%s}' % value
7881
return value
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Fixed passing lists and tuples of strings containing special characters
2+
``"``, ``\``, ``{``, ``}`` and ``\n`` as options to :mod:`~tkinter.ttk`
3+
widgets.

0 commit comments

Comments
 (0)