diff options
-rw-r--r-- | Doc/whatsnew/3.14.rst | 7 | ||||
-rw-r--r-- | Lib/test/test_tkinter/test_variables.py | 39 | ||||
-rw-r--r-- | Lib/tkinter/__init__.py | 30 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2024-06-07-15-03-54.gh-issue-120220.NNxrr_.rst | 3 |
4 files changed, 58 insertions, 21 deletions
diff --git a/Doc/whatsnew/3.14.rst b/Doc/whatsnew/3.14.rst index 128ada42843..185a4670d85 100644 --- a/Doc/whatsnew/3.14.rst +++ b/Doc/whatsnew/3.14.rst @@ -1642,6 +1642,13 @@ Deprecated Deprecate :meth:`symtable.Class.get_methods` due to the lack of interest. (Contributed by Bénédikt Tran in :gh:`119698`.) +* :mod:`tkinter`: + The :class:`!tkinter.Variable` methods :meth:`!trace_variable`, + :meth:`!trace_vdelete` and :meth:`!trace_vinfo` are now deprecated. + Use :meth:`!trace_add`, :meth:`!trace_remove` and :meth:`!trace_info` + instead. + (Contributed by Serhiy Storchaka in :gh:`120220`.) + * :mod:`urllib.parse`: Accepting objects with false values (like ``0`` and ``[]``) except empty strings, byte-like objects and ``None`` in :mod:`urllib.parse` functions diff --git a/Lib/test/test_tkinter/test_variables.py b/Lib/test/test_tkinter/test_variables.py index def7aec077e..75b3a6934fc 100644 --- a/Lib/test/test_tkinter/test_variables.py +++ b/Lib/test/test_tkinter/test_variables.py @@ -122,9 +122,14 @@ class TestVariable(TestBase): trace.append(('read',) + args) def write_tracer(*args): trace.append(('write',) + args) - cb1 = v.trace_variable('r', read_tracer) - cb2 = v.trace_variable('wu', write_tracer) - self.assertEqual(sorted(v.trace_vinfo()), [('r', cb1), ('wu', cb2)]) + with self.assertWarns(DeprecationWarning) as cm: + cb1 = v.trace_variable('r', read_tracer) + self.assertEqual(cm.filename, __file__) + with self.assertWarns(DeprecationWarning): + cb2 = v.trace_variable('wu', write_tracer) + with self.assertWarns(DeprecationWarning) as cm: + self.assertEqual(sorted(v.trace_vinfo()), [('r', cb1), ('wu', cb2)]) + self.assertEqual(cm.filename, __file__) self.assertEqual(trace, []) v.set('spam') @@ -135,20 +140,30 @@ class TestVariable(TestBase): self.assertEqual(trace, [('read', vname, '', 'r')]) trace = [] - info = sorted(v.trace_vinfo()) - v.trace_vdelete('w', cb1) # Wrong mode - self.assertEqual(sorted(v.trace_vinfo()), info) + with self.assertWarns(DeprecationWarning): + info = sorted(v.trace_vinfo()) + with self.assertWarns(DeprecationWarning): + v.trace_vdelete('w', cb1) # Wrong mode + with self.assertWarns(DeprecationWarning): + self.assertEqual(sorted(v.trace_vinfo()), info) with self.assertRaises(TclError): - v.trace_vdelete('r', 'spam') # Wrong command name - self.assertEqual(sorted(v.trace_vinfo()), info) - v.trace_vdelete('r', (cb1, 43)) # Wrong arguments - self.assertEqual(sorted(v.trace_vinfo()), info) + with self.assertWarns(DeprecationWarning): + v.trace_vdelete('r', 'spam') # Wrong command name + with self.assertWarns(DeprecationWarning): + self.assertEqual(sorted(v.trace_vinfo()), info) + with self.assertWarns(DeprecationWarning): + v.trace_vdelete('r', (cb1, 43)) # Wrong arguments + with self.assertWarns(DeprecationWarning): + self.assertEqual(sorted(v.trace_vinfo()), info) v.get() self.assertEqual(trace, [('read', vname, '', 'r')]) trace = [] - v.trace_vdelete('r', cb1) - self.assertEqual(v.trace_vinfo(), [('wu', cb2)]) + with self.assertWarns(DeprecationWarning) as cm: + v.trace_vdelete('r', cb1) + self.assertEqual(cm.filename, __file__) + with self.assertWarns(DeprecationWarning): + self.assertEqual(v.trace_vinfo(), [('wu', cb2)]) v.get() self.assertEqual(trace, []) diff --git a/Lib/tkinter/__init__.py b/Lib/tkinter/__init__.py index 0baed8b569e..71a265e3532 100644 --- a/Lib/tkinter/__init__.py +++ b/Lib/tkinter/__init__.py @@ -500,10 +500,14 @@ class Variable: Return the name of the callback. - This deprecated method wraps a deprecated Tcl method that will - likely be removed in the future. Use trace_add() instead. + This deprecated method wraps a deprecated Tcl method removed + in Tcl 9.0. Use trace_add() instead. """ - # TODO: Add deprecation warning + import warnings + warnings.warn( + "trace_variable() is deprecated and not supported with Tcl 9; " + "use trace_add() instead.", + DeprecationWarning, stacklevel=2) cbname = self._register(callback) self._tk.call("trace", "variable", self._name, mode, cbname) return cbname @@ -516,10 +520,14 @@ class Variable: MODE is one of "r", "w", "u" for read, write, undefine. CBNAME is the name of the callback returned from trace_variable or trace. - This deprecated method wraps a deprecated Tcl method that will - likely be removed in the future. Use trace_remove() instead. + This deprecated method wraps a deprecated Tcl method removed + in Tcl 9.0. Use trace_remove() instead. """ - # TODO: Add deprecation warning + import warnings + warnings.warn( + "trace_vdelete() is deprecated and not supported with Tcl 9; " + "use trace_remove() instead.", + DeprecationWarning, stacklevel=2) self._tk.call("trace", "vdelete", self._name, mode, cbname) cbname = self._tk.splitlist(cbname)[0] for m, ca in self.trace_info(): @@ -535,10 +543,14 @@ class Variable: def trace_vinfo(self): """Return all trace callback information. - This deprecated method wraps a deprecated Tcl method that will - likely be removed in the future. Use trace_info() instead. + This deprecated method wraps a deprecated Tcl method removed + in Tcl 9.0. Use trace_info() instead. """ - # TODO: Add deprecation warning + import warnings + warnings.warn( + "trace_vinfo() is deprecated and not supported with Tcl 9; " + "use trace_info() instead.", + DeprecationWarning, stacklevel=2) return [self._tk.splitlist(x) for x in self._tk.splitlist( self._tk.call("trace", "vinfo", self._name))] diff --git a/Misc/NEWS.d/next/Library/2024-06-07-15-03-54.gh-issue-120220.NNxrr_.rst b/Misc/NEWS.d/next/Library/2024-06-07-15-03-54.gh-issue-120220.NNxrr_.rst new file mode 100644 index 00000000000..b60b9430728 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2024-06-07-15-03-54.gh-issue-120220.NNxrr_.rst @@ -0,0 +1,3 @@ +Deprecate the :class:`!tkinter.Variable` methods :meth:`!trace_variable`, +:meth:`!trace_vdelete` and :meth:`!trace_vinfo`. Methods :meth:`!trace_add`, +:meth:`!trace_remove` and :meth:`!trace_info` can be used instead. |