https://github.com/python/cpython/commit/7ea523f47cdb4cf512a1e2ae1f93f5d19a48945d
commit: 7ea523f47cdb4cf512a1e2ae1f93f5d19a48945d
branch: main
author: Zhikang Yan <[email protected]>
committer: terryjreedy <[email protected]>
date: 2024-12-01T19:29:27Z
summary:

gh-126899: Add `**kw` to `tkinter.Misc.after` and `tkinter.Misc.after_idle` 
(#126900)


---------
Co-authored-by: Serhiy Storchaka <[email protected]>

files:
A Misc/NEWS.d/next/Library/2024-11-16-10-52-48.gh-issue-126899.GFnfBt.rst
M Doc/whatsnew/3.14.rst
M Lib/test/test_tkinter/test_misc.py
M Lib/tkinter/__init__.py
M Misc/ACKS

diff --git a/Doc/whatsnew/3.14.rst b/Doc/whatsnew/3.14.rst
index 869a47c1261293..f9322da3d4fbb0 100644
--- a/Doc/whatsnew/3.14.rst
+++ b/Doc/whatsnew/3.14.rst
@@ -576,6 +576,14 @@ sys
   from other interpreters than the one it's called in.
 
 
+tkinter
+-------
+
+* Make tkinter widget methods :meth:`!after` and :meth:`!after_idle` accept
+  arguments passed by keyword.
+  (Contributed by Zhikang Yan in :gh:`126899`.)
+
+
 unicodedata
 -----------
 
diff --git a/Lib/test/test_tkinter/test_misc.py 
b/Lib/test/test_tkinter/test_misc.py
index 579ce2af9fa0bf..475edcbd5338a7 100644
--- a/Lib/test/test_tkinter/test_misc.py
+++ b/Lib/test/test_tkinter/test_misc.py
@@ -123,9 +123,9 @@ def test_tk_setPalette(self):
     def test_after(self):
         root = self.root
 
-        def callback(start=0, step=1):
+        def callback(start=0, step=1, *, end=0):
             nonlocal count
-            count = start + step
+            count = start + step + end
 
         # Without function, sleeps for ms.
         self.assertIsNone(root.after(1))
@@ -161,12 +161,18 @@ def callback(start=0, step=1):
         root.update()  # Process all pending events.
         self.assertEqual(count, 53)
 
+        # Set up with callback with keyword args.
+        count = 0
+        timer1 = root.after(0, callback, 42, step=11, end=1)
+        root.update()  # Process all pending events.
+        self.assertEqual(count, 54)
+
     def test_after_idle(self):
         root = self.root
 
-        def callback(start=0, step=1):
+        def callback(start=0, step=1, *, end=0):
             nonlocal count
-            count = start + step
+            count = start + step + end
 
         # Set up with callback with no args.
         count = 0
@@ -193,6 +199,12 @@ def callback(start=0, step=1):
         with self.assertRaises(tkinter.TclError):
             root.tk.call(script)
 
+        # Set up with callback with keyword args.
+        count = 0
+        idle1 = root.after_idle(callback, 42, step=11, end=1)
+        root.update()  # Process all pending events.
+        self.assertEqual(count, 54)
+
     def test_after_cancel(self):
         root = self.root
 
diff --git a/Lib/tkinter/__init__.py b/Lib/tkinter/__init__.py
index dd7b3e138f4236..bfec04bb6c1e6e 100644
--- a/Lib/tkinter/__init__.py
+++ b/Lib/tkinter/__init__.py
@@ -847,7 +847,7 @@ def tk_focusPrev(self):
         if not name: return None
         return self._nametowidget(name)
 
-    def after(self, ms, func=None, *args):
+    def after(self, ms, func=None, *args, **kw):
         """Call function once after given time.
 
         MS specifies the time in milliseconds. FUNC gives the
@@ -861,7 +861,7 @@ def after(self, ms, func=None, *args):
         else:
             def callit():
                 try:
-                    func(*args)
+                    func(*args, **kw)
                 finally:
                     try:
                         self.deletecommand(name)
@@ -875,13 +875,13 @@ def callit():
             name = self._register(callit)
             return self.tk.call('after', ms, name)
 
-    def after_idle(self, func, *args):
+    def after_idle(self, func, *args, **kw):
         """Call FUNC once if the Tcl main loop has no event to
         process.
 
         Return an identifier to cancel the scheduling with
         after_cancel."""
-        return self.after('idle', func, *args)
+        return self.after('idle', func, *args, **kw)
 
     def after_cancel(self, id):
         """Cancel scheduling of function identified with ID.
diff --git a/Misc/ACKS b/Misc/ACKS
index cd34846574b304..fc4b83a0e2b823 100644
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -2079,6 +2079,7 @@ Arnon Yaari
 Alakshendra Yadav
 Hirokazu Yamamoto
 Masayuki Yamamoto
+Zhikang Yan
 Jingchen Ye
 Ka-Ping Yee
 Chi Hsuan Yen
diff --git 
a/Misc/NEWS.d/next/Library/2024-11-16-10-52-48.gh-issue-126899.GFnfBt.rst 
b/Misc/NEWS.d/next/Library/2024-11-16-10-52-48.gh-issue-126899.GFnfBt.rst
new file mode 100644
index 00000000000000..c1a0ed6438135d
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2024-11-16-10-52-48.gh-issue-126899.GFnfBt.rst
@@ -0,0 +1,2 @@
+Make tkinter widget methods :meth:`!after` and :meth:`!after_idle` accept
+arguments passed by keyword.

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]

Reply via email to