Jeśli uruchomić następujący kod z terminala, pojawia się jako komunikat o błędzie w terminalu:W jaki sposób uczynić cichsze wyjątki głośniejszymi w tkinter?
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()
Jednakże, jeśli go uruchomić bez terminala (powiedzmy, przez dwukrotne kliknięcie ikony), przy czym komunikat o błędzie jest wyłączony.
W mojej prawdziwej, bardziej skomplikowanej aplikacji Tkinter, podoba mi się, że GUI jest trochę odporny na zderzenia. Nie podoba mi się to, że moi użytkownicy mają trudności z udzieleniem mi przydatnej informacji zwrotnej w celu naprawienia powstałego nieoczekiwanego zachowania.
Jak mam sobie z tym poradzić? Czy istnieje standardowy sposób na ujawnienie śladów zwrotnych lub strakotypu lub czegoś innego w aplikacji Tkinter? Szukam czegoś bardziej eleganckiego niż próba wprowadzenia/z wyjątkiem wszędzie.
EDYCJA: Jochen Ritzel podał poniżej doskonałą odpowiedź, która wyświetli okno z ostrzeżeniem i wspomniał o dołączeniu go do klasy. Wystarczy, aby to jednoznacznie:
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()
Moja pozostała zamieszanie: Jochen wspomina o możliwości mające różne funkcje raportowania wyjątek w różnych ramkach. Nie widzę jeszcze, jak to zrobić. Czy to oczywiste?
Wyjątek jest nadal wyprowadzany po dwukrotnym kliknięciu ikony. Po prostu nie drukujesz nigdzie standardowo. – Falmarri
Zgoda! Szukam osób, które polecą elegancki/standardowy sposób na ujawnienie użytkownikowi stdout lub stderror. – Andrew
Klasa 'App' to ramka, zwykle wyprowadzona z' tk.Frame'. Jeśli twój program ma dwie różne klasy klatek, które były używane dla różnych rzeczy, to każda klasa klatek może mieć własną wersję 'report_callback_exception()', która wyświetla błąd w inny sposób. –