[New-bugs-announce] [issue32207] IDLE: run's tk update adds extra traceback on callback error
Terry J. Reedy
report at bugs.python.org
Sun Dec 3 20:47:09 EST 2017
New submission from Terry J. Reedy <tjreedy at udel.edu>:
import tkinter as tk
root = tk.Tk()
def bad(): print(a, 'bad')
def good(): print('good')
root.after(1000, bad)
root.after(1500, good)
root.mainloop()
# Correctly gives this traceback and output:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Programs\Python37\lib\tkinter\__init__.py", line 1699, in __call__
return self.func(*args)
File "C:\Programs\Python37\lib\tkinter\__init__.py", line 745, in callit
func(*args)
File "F:\Python\a\tem2.py", line 13, in bad
def bad(): print(a, 'bad')
NameError: name 'a' is not defined
good
>>>
====================================
Remove or comment-out the blocking 'root.mainloop()' call and run the result from an IDLE editor. The callbacks are still called because after user code is run, run.py calls tcl.update in a loop nominally 20 x per second. This allows developers to interact with a 'live' gui by entering statements in the shell at '>>>' prompts. The result is this.
-------------
>>> Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Programs\Python37\lib\idlelib\run.py", line 137, in main
seq, request = rpc.request_queue.get(block=True, timeout=0.05)
File "C:\Programs\Python37\lib\queue.py", line 169, in get
raise Empty
queue.Empty
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
<The NameError traceback and message, as before.>
--------------
The relevant code in run.py was written before callback chaining.
try:
seq, request = rpc.request_queue.get(block=True, timeout=0.05)
except queue.Empty:
handle_tk_events()
continue
Experiments with normal exceptions in a shell suggest that wrapping handle_tk_events in try:except and re-raising any exception 'from None' should work.
try:
handle_tk_events()
except BaseException as e:
raise e from None
However, it appears that callback errors resulting from handle_tk_events() are not being caught here. (print('message') and 1/0 before 'raise' have no visible effect.) I will investigate more later.
----------
assignee: terry.reedy
components: IDLE
messages: 307534
nosy: terry.reedy
priority: normal
severity: normal
stage: needs patch
status: open
title: IDLE: run's tk update adds extra traceback on callback error
type: behavior
versions: Python 3.6, Python 3.7
_______________________________________
Python tracker <report at bugs.python.org>
<https://bugs.python.org/issue32207>
_______________________________________
More information about the New-bugs-announce
mailing list