Skip to content

Commit f3598e1

Browse files
committed
Add after_info to tkinter
1 parent 74382a3 commit f3598e1

File tree

3 files changed

+54
-0
lines changed

3 files changed

+54
-0
lines changed

Lib/tkinter/__init__.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -759,6 +759,7 @@ def after_idle(self, func, *args):
759759
Return an identifier to cancel the scheduling with
760760
after_cancel."""
761761
return self.after('idle', func, *args)
762+
762763
def after_cancel(self, id):
763764
"""Cancel scheduling of function identified with ID.
764765
@@ -775,6 +776,24 @@ def after_cancel(self, id):
775776
except TclError:
776777
pass
777778
self.tk.call('after', 'cancel', id)
779+
780+
def after_info(self, id=None):
781+
"""Return information about existing event handlers.
782+
783+
With no argument, return a list of the identifiers for all existing
784+
event handlers created by the after command for this interpreter.
785+
If id is supplied, it specifies an existing handler; id must have been
786+
the return value from some previous call to after or after_idle and it
787+
must not have triggered yet or been canceled. If the id doesn't exist,
788+
a TclError is raised. Othewise, the return value is a tuple
789+
containing (script, type) where type is either 'idle' or 'timer' to
790+
indicate what kind of event handler it is.
791+
"""
792+
if id is None:
793+
return self.tk.call('after', 'info')
794+
else:
795+
return self.tk.call('after', 'info', id)
796+
778797
def bell(self, displayof=0):
779798
"""Ring a display's bell."""
780799
self.tk.call(('bell',) + self._displayof(displayof))

Lib/tkinter/test/test_tkinter/test_misc.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,40 @@ def callback():
156156
with self.assertRaises(tkinter.TclError):
157157
root.tk.call('after', 'info', idle1)
158158

159+
def test_after_info(self):
160+
root = self.root
161+
# Add timer.
162+
timer = root.after(1, lambda: 'break')
163+
164+
# With no parameter, it returns a tuple of the event handler ids.
165+
self.assertEqual(root.after_info(), (timer, ))
166+
# Process event to remove it.
167+
root.update()
168+
169+
timer1 = root.after(5000, lambda: 'break')
170+
timer2 = root.after(5000, lambda: 'break')
171+
idle1 = root.after_idle(lambda: 'break')
172+
# Only contains new events and not 'timer'.
173+
self.assertEqual(root.after_info(), (idle1, timer2, timer1))
174+
175+
# With a paramter returns a tuple of (script, type).
176+
timer1_info = root.after_info(timer1)
177+
self.assertIn('lambda', timer1_info[0])
178+
self.assertEqual(timer1_info[1], 'timer')
179+
idle1_info = root.after_info(idle1)
180+
self.assertIn('lambda', idle1_info[0])
181+
self.assertEqual(idle1_info[1], 'idle')
182+
183+
root.after_cancel(timer1)
184+
with self.assertRaises(tkinter.TclError):
185+
root.after_info(timer1)
186+
root.after_cancel(timer2)
187+
with self.assertRaises(tkinter.TclError):
188+
root.after_info(timer2)
189+
root.after_cancel(idle1)
190+
with self.assertRaises(tkinter.TclError):
191+
root.after_info(idle1)
192+
159193

160194
tests_gui = (MiscTest, )
161195

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Add after_info to tkinter.

0 commit comments

Comments
 (0)