Skip to content

Commit 9b84cc8

Browse files
[2.7] bpo-33974: Fix passing special characters to ttk widgets. (GH-7986) (GH-8021)
Fix passing lists and tuples of strings containing special characters '"', '\\', '{', '}' and '\n' as options to tkinter.ttk widgets. (cherry picked from commit 5bb5bbf)
1 parent 0464de0 commit 9b84cc8

File tree

3 files changed

+44
-1
lines changed

3 files changed

+44
-1
lines changed

Lib/lib-tk/Tkinter.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ def _stringify(value):
7171
if isinstance(value, (list, tuple)):
7272
if len(value) == 1:
7373
value = _stringify(value[0])
74-
if value[0] == '{':
74+
if _magic_re.search(value):
7575
value = '{%s}' % value
7676
else:
7777
value = '{%s}' % _join(value)
@@ -85,7 +85,10 @@ def _stringify(value):
8585
elif _magic_re.search(value):
8686
# add '\' before special characters and spaces
8787
value = _magic_re.sub(r'\\\1', value)
88+
value = value.replace('\n', r'\n')
8889
value = _space_re.sub(r'\\\1', value)
90+
if value[0] == '"':
91+
value = '\\' + value
8992
elif value[0] == '"' or _space_re.search(value):
9093
value = '{%s}' % value
9194
return value

Lib/test/test_tcl.py

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

664+
def test_join(self):
665+
join = tkinter._join
666+
tcl = self.interp.tk
667+
def unpack(s):
668+
return tcl.call('lindex', s, 0)
669+
def check(value):
670+
self.assertEqual(unpack(join([value])), value)
671+
self.assertEqual(unpack(join([value, 0])), value)
672+
self.assertEqual(unpack(unpack(join([[value]]))), value)
673+
self.assertEqual(unpack(unpack(join([[value, 0]]))), value)
674+
self.assertEqual(unpack(unpack(join([[value], 0]))), value)
675+
self.assertEqual(unpack(unpack(join([[value, 0], 0]))), value)
676+
check('')
677+
check('spam')
678+
check('sp am')
679+
check('sp\tam')
680+
check('sp\nam')
681+
check(' \t\n')
682+
check('{spam}')
683+
check('{sp am}')
684+
check('"spam"')
685+
check('"sp am"')
686+
check('{"spam"}')
687+
check('"{spam}"')
688+
check('sp\\am')
689+
check('"sp\\am"')
690+
check('"{}" "{}"')
691+
check('"\\')
692+
check('"{')
693+
check('"}')
694+
check('\n\\')
695+
check('\n{')
696+
check('\n}')
697+
check('\\\n')
698+
check('{\n')
699+
check('}\n')
700+
664701

665702
character_size = 4 if sys.maxunicode > 0xFFFF else 2
666703

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)