Ако стартирам следния код от терминал, получавам полезно съобщение за грешка в терминала:
import Tkinter as tk
master = tk.Tk()
def callback():
raise UserWarning("Exception!")
b = tk.Button(master, text="This will raise an exception", command=callback)
b.pack()
tk.mainloop()
Ако обаче го стартирам без терминал (да речем, като щракна двукратно върху икона), съобщението за грешка се потиска.
В моето истинско, по-сложно Tkinter приложение ми харесва, че GUI е малко устойчив на сривове. Не ми харесва, че на моите потребители им е трудно да ми дадат полезна обратна връзка, за да коригирам полученото неочаквано поведение.
Как трябва да се справя с това? Има ли стандартен начин за излагане на tracebacks или stderror или какво ли още не в приложение на Tkinter? Търся нещо по-елегантно от това да пробвам/освен навсякъде.
РЕДАКТИРАНЕ: Йохен Рицел даде отличен отговор по-долу, който изскача предупредителна кутия и спомена за прикачването му към клас. Само за да направя това изрично:
import Tkinter as tk
import traceback, tkMessageBox
class App:
def __init__(self, master):
master.report_callback_exception = self.report_callback_exception
self.frame = tk.Frame(master)
self.frame.pack()
b = tk.Button(
self.frame, text="This will cause an exception",
command=self.cause_exception)
b.pack()
def cause_exception(self):
a = []
a.a = 0 #A traceback makes this easy to catch and fix
def report_callback_exception(self, *args):
err = traceback.format_exception(*args)
tkMessageBox.showerror('Exception', err)
root = tk.Tk()
app = App(root)
root.mainloop()
Оставащото ми объркване: Йохен споменава възможността да има различни функции за докладване на изключения в различни рамки. Все още не виждам как да го направя. Това очевидно ли е?
App
е рамка, обикновено извлечена отtk.Frame
. Ако вашата програма имаше два различни класа рамки, които се използват за различни неща, тогава всеки клас рамка може да има своя собствена версия наreport_callback_exception()
, която показва грешката по различен начин. - person Don Kirkby   schedule 24.08.2015tkMessageBox
се е преместил вtkinter.messagebox
, така чеimport tkinter.messagebox
след това в тялото наreport_callback
tkinter.messagebox.showerror(...)
. - person PeterK   schedule 13.06.2021