mirror of
https://github.com/python/cpython.git
synced 2025-09-27 10:50:04 +00:00
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.
This commit is contained in:
parent
f874bd1f06
commit
5bb5bbfca8
3 changed files with 44 additions and 1 deletions
|
@ -649,6 +649,43 @@ class TclTest(unittest.TestCase):
|
||||||
expected = {'a': (1, 2, 3), 'something': 'foo', 'status': ''}
|
expected = {'a': (1, 2, 3), 'something': 'foo', 'status': ''}
|
||||||
self.assertEqual(splitdict(tcl, arg), expected)
|
self.assertEqual(splitdict(tcl, arg), expected)
|
||||||
|
|
||||||
|
def test_join(self):
|
||||||
|
join = tkinter._join
|
||||||
|
tcl = self.interp.tk
|
||||||
|
def unpack(s):
|
||||||
|
return tcl.call('lindex', s, 0)
|
||||||
|
def check(value):
|
||||||
|
self.assertEqual(unpack(join([value])), value)
|
||||||
|
self.assertEqual(unpack(join([value, 0])), value)
|
||||||
|
self.assertEqual(unpack(unpack(join([[value]]))), value)
|
||||||
|
self.assertEqual(unpack(unpack(join([[value, 0]]))), value)
|
||||||
|
self.assertEqual(unpack(unpack(join([[value], 0]))), value)
|
||||||
|
self.assertEqual(unpack(unpack(join([[value, 0], 0]))), value)
|
||||||
|
check('')
|
||||||
|
check('spam')
|
||||||
|
check('sp am')
|
||||||
|
check('sp\tam')
|
||||||
|
check('sp\nam')
|
||||||
|
check(' \t\n')
|
||||||
|
check('{spam}')
|
||||||
|
check('{sp am}')
|
||||||
|
check('"spam"')
|
||||||
|
check('"sp am"')
|
||||||
|
check('{"spam"}')
|
||||||
|
check('"{spam}"')
|
||||||
|
check('sp\\am')
|
||||||
|
check('"sp\\am"')
|
||||||
|
check('"{}" "{}"')
|
||||||
|
check('"\\')
|
||||||
|
check('"{')
|
||||||
|
check('"}')
|
||||||
|
check('\n\\')
|
||||||
|
check('\n{')
|
||||||
|
check('\n}')
|
||||||
|
check('\\\n')
|
||||||
|
check('{\n')
|
||||||
|
check('}\n')
|
||||||
|
|
||||||
def test_new_tcl_obj(self):
|
def test_new_tcl_obj(self):
|
||||||
self.assertRaises(TypeError, _tkinter.Tcl_Obj)
|
self.assertRaises(TypeError, _tkinter.Tcl_Obj)
|
||||||
|
|
||||||
|
|
|
@ -61,7 +61,7 @@ def _stringify(value):
|
||||||
if isinstance(value, (list, tuple)):
|
if isinstance(value, (list, tuple)):
|
||||||
if len(value) == 1:
|
if len(value) == 1:
|
||||||
value = _stringify(value[0])
|
value = _stringify(value[0])
|
||||||
if value[0] == '{':
|
if _magic_re.search(value):
|
||||||
value = '{%s}' % value
|
value = '{%s}' % value
|
||||||
else:
|
else:
|
||||||
value = '{%s}' % _join(value)
|
value = '{%s}' % _join(value)
|
||||||
|
@ -72,7 +72,10 @@ def _stringify(value):
|
||||||
elif _magic_re.search(value):
|
elif _magic_re.search(value):
|
||||||
# add '\' before special characters and spaces
|
# add '\' before special characters and spaces
|
||||||
value = _magic_re.sub(r'\\\1', value)
|
value = _magic_re.sub(r'\\\1', value)
|
||||||
|
value = value.replace('\n', r'\n')
|
||||||
value = _space_re.sub(r'\\\1', value)
|
value = _space_re.sub(r'\\\1', value)
|
||||||
|
if value[0] == '"':
|
||||||
|
value = '\\' + value
|
||||||
elif value[0] == '"' or _space_re.search(value):
|
elif value[0] == '"' or _space_re.search(value):
|
||||||
value = '{%s}' % value
|
value = '{%s}' % value
|
||||||
return value
|
return value
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
Fixed passing lists and tuples of strings containing special characters
|
||||||
|
``"``, ``\``, ``{``, ``}`` and ``\n`` as options to :mod:`~tkinter.ttk`
|
||||||
|
widgets.
|
Loading…
Add table
Add a link
Reference in a new issue