diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2014-07-30 15:34:01 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2014-07-30 15:34:01 (GMT) |
commit | f44611cadfa8f4f592a2b13d0dbffa84bccc4418 (patch) | |
tree | d78adf08a5365a9a2df4bd851289310338ad3588 | |
parent | da565a790c0851650d6466cde43381e208746197 (diff) | |
parent | 74596a887aff06d7ec45957672126881f1865cf2 (diff) | |
download | cpython-f44611cadfa8f4f592a2b13d0dbffa84bccc4418.zip cpython-f44611cadfa8f4f592a2b13d0dbffa84bccc4418.tar.gz cpython-f44611cadfa8f4f592a2b13d0dbffa84bccc4418.tar.bz2 |
Issue #21580: Now Tkinter correctly handles bytes arguments passed to Tk.
In particular this allows to initialize images from binary data.
-rw-r--r-- | Lib/test/test_tcl.py | 24 | ||||
-rw-r--r-- | Lib/tkinter/test/test_tkinter/test_images.py | 5 | ||||
-rw-r--r-- | Misc/NEWS | 3 | ||||
-rw-r--r-- | Modules/_tkinter.c | 4 |
4 files changed, 20 insertions, 16 deletions
diff --git a/Lib/test/test_tcl.py b/Lib/test/test_tcl.py index 23e7a30..79fb96be5 100644 --- a/Lib/test/test_tcl.py +++ b/Lib/test/test_tcl.py @@ -389,8 +389,12 @@ class TclTest(unittest.TestCase): self.assertEqual(passValue('str\x00ing'), 'str\x00ing') self.assertEqual(passValue('str\x00ing\xbd'), 'str\x00ing\xbd') self.assertEqual(passValue('str\x00ing\u20ac'), 'str\x00ing\u20ac') - self.assertEqual(passValue(b'str\x00ing'), 'str\x00ing') - self.assertEqual(passValue(b'str\xc0\x80ing'), 'str\x00ing') + self.assertEqual(passValue(b'str\x00ing'), + b'str\x00ing' if self.wantobjects else 'str\x00ing') + self.assertEqual(passValue(b'str\xc0\x80ing'), + b'str\xc0\x80ing' if self.wantobjects else 'str\xc0\x80ing') + self.assertEqual(passValue(b'str\xbding'), + b'str\xbding' if self.wantobjects else 'str\xbding') for i in (0, 1, -1, 2**31-1, -2**31): self.assertEqual(passValue(i), i if self.wantobjects else str(i)) for f in (0.0, 1.0, -1.0, 1/3, @@ -440,12 +444,14 @@ class TclTest(unittest.TestCase): check('string\xbd', 'string\xbd') check('string\u20ac', 'string\u20ac') check(b'string', 'string') - check(b'string\xe2\x82\xac', 'string\u20ac') + check(b'string\xe2\x82\xac', 'string\xe2\x82\xac') + check(b'string\xbd', 'string\xbd') check('str\x00ing', 'str\x00ing') check('str\x00ing\xbd', 'str\x00ing\xbd') check('str\x00ing\u20ac', 'str\x00ing\u20ac') - check(b'str\xc0\x80ing', 'str\x00ing') - check(b'str\xc0\x80ing\xe2\x82\xac', 'str\x00ing\u20ac') + check(b'str\x00ing', 'str\x00ing') + check(b'str\xc0\x80ing', 'str\xc0\x80ing') + check(b'str\xc0\x80ing\xe2\x82\xac', 'str\xc0\x80ing\xe2\x82\xac') for i in (0, 1, -1, 2**31-1, -2**31): check(i, str(i)) for f in (0.0, 1.0, -1.0): @@ -493,9 +499,9 @@ class TclTest(unittest.TestCase): if tcl_version >= (8, 5): if not self.wantobjects or get_tk_patchlevel() < (8, 5, 5): # Before 8.5.5 dicts were converted to lists through string - expected = ('12', '\u20ac', '\u20ac', '3.4') + expected = ('12', '\u20ac', '\xe2\x82\xac', '3.4') else: - expected = (12, '\u20ac', '\u20ac', (3.4,)) + expected = (12, '\u20ac', b'\xe2\x82\xac', (3.4,)) testcases += [ (call('dict', 'create', 12, '\u20ac', b'\xe2\x82\xac', (3.4,)), expected), @@ -543,9 +549,9 @@ class TclTest(unittest.TestCase): if tcl_version >= (8, 5): if not self.wantobjects or get_tk_patchlevel() < (8, 5, 5): # Before 8.5.5 dicts were converted to lists through string - expected = ('12', '\u20ac', '\u20ac', '3.4') + expected = ('12', '\u20ac', '\xe2\x82\xac', '3.4') else: - expected = (12, '\u20ac', '\u20ac', (3.4,)) + expected = (12, '\u20ac', b'\xe2\x82\xac', (3.4,)) testcases += [ (call('dict', 'create', 12, '\u20ac', b'\xe2\x82\xac', (3.4,)), expected), diff --git a/Lib/tkinter/test/test_tkinter/test_images.py b/Lib/tkinter/test/test_tkinter/test_images.py index e8ec604..ff05bbe 100644 --- a/Lib/tkinter/test/test_tkinter/test_images.py +++ b/Lib/tkinter/test/test_tkinter/test_images.py @@ -161,21 +161,18 @@ class PhotoImageTest(unittest.TestCase): def test_create_from_ppm_file(self): self.check_create_from_file('ppm') - @unittest.skip('issue #21580') def test_create_from_ppm_data(self): self.check_create_from_data('ppm') def test_create_from_pgm_file(self): self.check_create_from_file('pgm') - @unittest.skip('issue #21580') def test_create_from_pgm_data(self): self.check_create_from_data('pgm') def test_create_from_gif_file(self): self.check_create_from_file('gif') - @unittest.skip('issue #21580') def test_create_from_gif_data(self): self.check_create_from_data('gif') @@ -183,12 +180,10 @@ class PhotoImageTest(unittest.TestCase): def test_create_from_png_file(self): self.check_create_from_file('png') - @unittest.skip('issue #21580') @requires_tcl(8, 6) def test_create_from_png_data(self): self.check_create_from_data('png') - @unittest.skip('issue #21580') def test_configure_data(self): image = tkinter.PhotoImage('::img::test', master=self.root) self.assertEqual(image['data'], '') @@ -113,6 +113,9 @@ Core and Builtins Library ------- +- Issue #21580: Now Tkinter correctly handles bytes arguments passed to Tk. + In particular this allows to initialize images from binary data. + - Issue #22003: When initialized from a bytes object, io.BytesIO() now defers making a copy until it is mutated, improving performance and memory use on some use cases. Patch by David Wilson. diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c index 0acded3..d2fda62 100644 --- a/Modules/_tkinter.c +++ b/Modules/_tkinter.c @@ -901,8 +901,8 @@ AsObj(PyObject *value) int overflow; if (PyBytes_Check(value)) - return Tcl_NewStringObj(PyBytes_AS_STRING(value), - PyBytes_GET_SIZE(value)); + return Tcl_NewByteArrayObj((unsigned char *)PyBytes_AS_STRING(value), + PyBytes_GET_SIZE(value)); else if (PyBool_Check(value)) return Tcl_NewBooleanObj(PyObject_IsTrue(value)); else if (PyLong_CheckExact(value) && |