diff -r c5f40d0b7faa Lib/tkinter/__init__.py --- a/Lib/tkinter/__init__.py Mon Oct 24 14:53:58 2016 +0300 +++ b/Lib/tkinter/__init__.py Mon Oct 24 17:12:43 2016 +0300 @@ -500,7 +500,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.""" @@ -3003,7 +3007,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.""" diff -r c5f40d0b7faa Lib/tkinter/test/test_tkinter/test_variables.py --- a/Lib/tkinter/test/test_tkinter/test_variables.py Mon Oct 24 14:53:58 2016 +0300 +++ b/Lib/tkinter/test/test_tkinter/test_variables.py Mon Oct 24 17:12:43 2016 +0300 @@ -217,15 +217,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): diff -r c5f40d0b7faa Lib/tkinter/test/test_ttk/test_extensions.py --- a/Lib/tkinter/test/test_ttk/test_extensions.py Mon Oct 24 14:53:58 2016 +0300 +++ b/Lib/tkinter/test/test_ttk/test_extensions.py Mon Oct 24 17:12:43 2016 +0300 @@ -69,14 +69,12 @@ class LabeledScaleTest(AbstractTkTest, u # 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, u # 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, u 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()