]> granicus.if.org Git - python/commitdiff
Issue #21580: Now Tkinter correctly handles bytes arguments passed to Tk.
authorSerhiy Storchaka <storchaka@gmail.com>
Wed, 30 Jul 2014 15:33:13 +0000 (18:33 +0300)
committerSerhiy Storchaka <storchaka@gmail.com>
Wed, 30 Jul 2014 15:33:13 +0000 (18:33 +0300)
In particular this allows to initialize images from binary data.

Lib/test/test_tcl.py
Lib/tkinter/test/test_tkinter/test_images.py
Misc/NEWS
Modules/_tkinter.c

index e57b5e16bbd7120972843aff8dfac475188ba913..f8031c9d2bb6f59503088f43b85016fc733bbb0e 100644 (file)
@@ -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,
@@ -438,12 +442,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):
@@ -488,9 +494,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),
@@ -535,9 +541,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),
index e8ec604cc1c3179810d29353d90ecfed0b0dbfd6..ff05bbe33cc1a2f94f7fc1e02de839c766f8d096 100644 (file)
@@ -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'], '')
index 4bb876fbaad10156330f8cd6976388fbc4d264e7..b554afd4b5c4cd6bba46ed0d60b843d97b7dfb17 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -27,6 +27,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 #17172: Make turtledemo start as active on OS X even when run with
   subprocess.  Patch by Lita Cho.
 
index e3d3757bb61a03f89a800e3e48d9ea47e54f647a..83161feec34e8b76807cef1efbb8d8027eb5f9bb 100644 (file)
@@ -881,8 +881,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) &&