-
-
Notifications
You must be signed in to change notification settings - Fork 31.6k
IDLE: run's tk update adds context traceback on callback error #76388
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
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.
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. 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. |
try: |
Thanks. I am still puzzled why the nested within nested try-except did not work as I expected, but I care more about fixing this. The result based on your suggestion is better (to read, I think) than extra nesting that did work. |
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields:
The text was updated successfully, but these errors were encountered: