summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2014-07-30 15:34:01 (GMT)
committerSerhiy Storchaka <storchaka@gmail.com>2014-07-30 15:34:01 (GMT)
commitf44611cadfa8f4f592a2b13d0dbffa84bccc4418 (patch)
treed78adf08a5365a9a2df4bd851289310338ad3588
parentda565a790c0851650d6466cde43381e208746197 (diff)
parent74596a887aff06d7ec45957672126881f1865cf2 (diff)
downloadcpython-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.py24
-rw-r--r--Lib/tkinter/test/test_tkinter/test_images.py5
-rw-r--r--Misc/NEWS3
-rw-r--r--Modules/_tkinter.c4
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'], '')
diff --git a/Misc/NEWS b/Misc/NEWS
index 10879e9..0637c1f 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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) &&