[Python-checkins] cpython (merge 3.5 -> 3.6): Issue #27939: Fixed bugs in tkinter.ttk.LabeledScale and tkinter.Scale caused

serhiy.storchaka python-checkins at python.org
Sun Oct 30 12:53:25 EDT 2016


https://hg.python.org/cpython/rev/91884d043fdc
changeset:   104823:91884d043fdc
branch:      3.6
parent:      104820:542065b03c10
parent:      104822:394b2b4da150
user:        Serhiy Storchaka <storchaka at gmail.com>
date:        Sun Oct 30 18:52:02 2016 +0200
summary:
  Issue #27939: Fixed bugs in tkinter.ttk.LabeledScale and tkinter.Scale caused
by representing the scale as float value internally in Tk.  tkinter.IntVar
now works if float value is set to underlying Tk variable.

files:
  Lib/tkinter/__init__.py                         |   8 +++-
  Lib/tkinter/test/test_tkinter/test_variables.py |   5 +-
  Lib/tkinter/test/test_ttk/test_extensions.py    |  17 +++++++--
  Misc/NEWS                                       |   4 ++
  4 files changed, 25 insertions(+), 9 deletions(-)


diff --git a/Lib/tkinter/__init__.py b/Lib/tkinter/__init__.py
--- a/Lib/tkinter/__init__.py
+++ b/Lib/tkinter/__init__.py
@@ -500,7 +500,11 @@
 
     def get(self):
         """Return the value of the variable as an integer."""
-        return self._tk.getint(self._tk.globalgetvar(self._name))
+        value = self._tk.globalgetvar(self._name)
+        try:
+            return self._tk.getint(value)
+        except (TypeError, TclError):
+            return int(self._tk.getdouble(value))
 
 class DoubleVar(Variable):
     """Value holder for float variables."""
@@ -3003,7 +3007,7 @@
         value = self.tk.call(self._w, 'get')
         try:
             return self.tk.getint(value)
-        except (ValueError, TclError):
+        except (ValueError, TypeError, TclError):
             return self.tk.getdouble(value)
     def set(self, value):
         """Set the value to VALUE."""
diff --git a/Lib/tkinter/test/test_tkinter/test_variables.py b/Lib/tkinter/test/test_tkinter/test_variables.py
--- a/Lib/tkinter/test/test_tkinter/test_variables.py
+++ b/Lib/tkinter/test/test_tkinter/test_variables.py
@@ -217,15 +217,14 @@
         self.assertEqual(123, v.get())
         self.root.globalsetvar("name", "345")
         self.assertEqual(345, v.get())
+        self.root.globalsetvar("name", "876.5")
+        self.assertEqual(876, v.get())
 
     def test_invalid_value(self):
         v = IntVar(self.root, name="name")
         self.root.globalsetvar("name", "value")
         with self.assertRaises((ValueError, TclError)):
             v.get()
-        self.root.globalsetvar("name", "345.0")
-        with self.assertRaises((ValueError, TclError)):
-            v.get()
 
 
 class TestDoubleVar(TestBase):
diff --git a/Lib/tkinter/test/test_ttk/test_extensions.py b/Lib/tkinter/test/test_ttk/test_extensions.py
--- a/Lib/tkinter/test/test_ttk/test_extensions.py
+++ b/Lib/tkinter/test/test_ttk/test_extensions.py
@@ -69,14 +69,12 @@
 
         # variable initialization/passing
         passed_expected = (('0', 0), (0, 0), (10, 10),
-            (-1, -1), (sys.maxsize + 1, sys.maxsize + 1))
+            (-1, -1), (sys.maxsize + 1, sys.maxsize + 1),
+            (2.5, 2), ('2.5', 2))
         for pair in passed_expected:
             x = ttk.LabeledScale(self.root, from_=pair[0])
             self.assertEqual(x.value, pair[1])
             x.destroy()
-        x = ttk.LabeledScale(self.root, from_='2.5')
-        self.assertRaises((ValueError, tkinter.TclError), x._variable.get)
-        x.destroy()
         x = ttk.LabeledScale(self.root, from_=None)
         self.assertRaises((ValueError, tkinter.TclError), x._variable.get)
         x.destroy()
@@ -155,8 +153,10 @@
         # The following update is needed since the test doesn't use mainloop,
         # at the same time this shouldn't affect test outcome
         x.update()
+        self.assertEqual(x.value, newval)
         self.assertEqual(x.label['text'],
                          newval if self.wantobjects else str(newval))
+        self.assertEqual(float(x.scale.get()), newval)
         self.assertGreater(x.scale.coords()[0], curr_xcoord)
         self.assertEqual(x.scale.coords()[0],
             int(x.label.place_info()['x']))
@@ -168,10 +168,19 @@
             conv = int
         x.value = conv(x.scale['to']) + 1 # no changes shouldn't happen
         x.update()
+        self.assertEqual(x.value, newval)
         self.assertEqual(conv(x.label['text']), newval)
+        self.assertEqual(float(x.scale.get()), newval)
         self.assertEqual(x.scale.coords()[0],
             int(x.label.place_info()['x']))
 
+        # non-integer value
+        x.value = newval = newval + 1.5
+        x.update()
+        self.assertEqual(x.value, int(newval))
+        self.assertEqual(conv(x.label['text']), int(newval))
+        self.assertEqual(float(x.scale.get()), newval)
+
         x.destroy()
 
 
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -31,6 +31,10 @@
 Library
 -------
 
+- Issue #27939: Fixed bugs in tkinter.ttk.LabeledScale and tkinter.Scale caused
+  by representing the scale as float value internally in Tk.  tkinter.IntVar
+  now works if float value is set to underlying Tk variable.
+
 - Issue #18844: The various ways of specifing weights for random.choices()
   now produce the same result sequences.
 

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list