]> granicus.if.org Git - python/commitdiff
Issue #27939: Fixed bugs in tkinter.ttk.LabeledScale and tkinter.Scale caused
authorSerhiy Storchaka <storchaka@gmail.com>
Sun, 30 Oct 2016 16:49:52 +0000 (18:49 +0200)
committerSerhiy Storchaka <storchaka@gmail.com>
Sun, 30 Oct 2016 16:49:52 +0000 (18:49 +0200)
by representing the scale as float value internally in Tk.  tkinter.IntVar
now works if float value is set to underlying Tk variable.

Lib/tkinter/__init__.py
Lib/tkinter/test/test_tkinter/test_variables.py
Lib/tkinter/test/test_ttk/test_extensions.py
Misc/NEWS

index 55bfb7f4146b8da136ab88a3900aa783802ea21a..1eaab44bfed35240bc67325a07a87e22d20569da 100644 (file)
@@ -357,7 +357,11 @@ class IntVar(Variable):
 
     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."""
@@ -2864,7 +2868,7 @@ class Scale(Widget):
         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."""
index 1f74453cea684702eaac25268f505c671e2c8b51..d8ba9cea747db0448cbfd2c901828214fa20b400 100644 (file)
@@ -167,15 +167,14 @@ class TestIntVar(TestBase):
         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):
index f33945cef9cbacc1f4d50fc6aa0bbe73276c90f6..218b27fc30ea1b8650ccd68338a17068702a0f34 100644 (file)
@@ -69,14 +69,12 @@ class LabeledScaleTest(AbstractTkTest, unittest.TestCase):
 
         # 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 @@ class LabeledScaleTest(AbstractTkTest, unittest.TestCase):
         # 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 @@ class LabeledScaleTest(AbstractTkTest, unittest.TestCase):
             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()
 
 
index cbc8c4d953f5ff722d300a90f5bd562b689ae9ee..4d84e7ed1e05942e0397c43e4822754a66f34107 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -113,6 +113,10 @@ Core and Builtins
 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 #28255: calendar.TextCalendar().prmonth() no longer prints a space
   at the start of new line after printing a month's calendar.  Patch by
   Xiang Zhang.