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

---------
Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
This commit is contained in:
Zhikang Yan 2024-12-02 03:29:27 +08:00 committed by GitHub
parent 04673d2f14
commit 7ea523f47c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 31 additions and 8 deletions

View file

@ -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
-----------

View file

@ -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

View file

@ -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.

View file

@ -2079,6 +2079,7 @@ Arnon Yaari
Alakshendra Yadav
Hirokazu Yamamoto
Masayuki Yamamoto
Zhikang Yan
Jingchen Ye
Ka-Ping Yee
Chi Hsuan Yen

View file

@ -0,0 +1,2 @@
Make tkinter widget methods :meth:`!after` and :meth:`!after_idle` accept
arguments passed by keyword.