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

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


https://hg.python.org/cpython/rev/9e3931aa1ff0
changeset: 104824:9e3931aa1ff0
parent: 104821:ee3670d9bda6
parent: 104823:91884d043fdc
user: Serhiy Storchaka <storchaka at gmail.com>
date: Sun Oct 30 18:53:09 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
@@ -99,6 +99,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 #28255: calendar.TextCalendar.prweek() no longer prints a space after
 a weeks's calendar. calendar.TextCalendar.pryear() no longer prints redundant
 newline after a year's calendar. Based on patch by Xiang Zhang.
-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /