bpo-44404: tkinter `after` support callable classes (GH-26812)

https://github.com/python/cpython/commit/e1f3bd2bb50a76ba15a2f8d561e2c9968ae... commit: e1f3bd2bb50a76ba15a2f8d561e2c9968ae3a1b2 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> committer: miss-islington <31488909+miss-islington@users.noreply.github.com> date: 2021-06-27T01:02:02-07:00 summary: bpo-44404: tkinter `after` support callable classes (GH-26812) (cherry picked from commit e9c8f784fa13ea3a51df3b72a498a3896ec9e768) Co-authored-by: E-Paine <63801254+E-Paine@users.noreply.github.com> files: A Misc/NEWS.d/next/Library/2021-06-20-19-01-11.bpo-44404.McfrYB.rst M Lib/tkinter/__init__.py M Lib/tkinter/test/test_tkinter/test_misc.py diff --git a/Lib/tkinter/__init__.py b/Lib/tkinter/__init__.py index 369004c9d1b3d..2513c972bc77f 100644 --- a/Lib/tkinter/__init__.py +++ b/Lib/tkinter/__init__.py @@ -841,7 +841,11 @@ def callit(): self.deletecommand(name) except TclError: pass - callit.__name__ = func.__name__ + try: + callit.__name__ = func.__name__ + except AttributeError: + # Required for callable classes (bpo-44404) + callit.__name__ = type(func).__name__ name = self._register(callit) return self.tk.call('after', ms, name) diff --git a/Lib/tkinter/test/test_tkinter/test_misc.py b/Lib/tkinter/test/test_tkinter/test_misc.py index d4b7cbd867bc0..ab8f64790dfc0 100644 --- a/Lib/tkinter/test/test_tkinter/test_misc.py +++ b/Lib/tkinter/test/test_tkinter/test_misc.py @@ -1,3 +1,4 @@ +import functools import unittest import tkinter import enum @@ -98,6 +99,12 @@ def callback(start=0, step=1): with self.assertRaises(tkinter.TclError): root.tk.call(script) + # Call with a callable class + count = 0 + timer1 = root.after(0, functools.partial(callback, 42, 11)) + root.update() # Process all pending events. + self.assertEqual(count, 53) + def test_after_idle(self): root = self.root diff --git a/Misc/NEWS.d/next/Library/2021-06-20-19-01-11.bpo-44404.McfrYB.rst b/Misc/NEWS.d/next/Library/2021-06-20-19-01-11.bpo-44404.McfrYB.rst new file mode 100644 index 0000000000000..ff6ca1bfa7242 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-06-20-19-01-11.bpo-44404.McfrYB.rst @@ -0,0 +1 @@ +:mod:`tkinter`'s ``after()`` method now supports callables without the ``__name__`` attribute.
participants (1)
-
miss-islington