python – 如何在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()

但是,如果我在没有终端的情况下运行它(例如,通过双击图标),则会禁止显示错误消息.

在我真实的,更复杂的Tkinter应用程序中,我喜欢GUI有点防撞击.我不喜欢我的用户很难给我有用的反馈来解决导致的意外行为.

我该怎么处理?有没有一种标准方法可以在Tkinter应用程序中公开回溯或stderror或诸如此类的东西?我正在寻找比尝试/除了各处更优雅的东西.

编辑:Jochen Ritzel给出了一个很好的答案,弹出一个警告框,并提到将它附加到一个班级.只是为了明确这一点:

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()

我仍然存在困惑:Jochen提到了在不同的框架中具有不同异常报告功能的可能性.我还没看到怎么做.这显而易见吗?

解决方法:

有report_callback_exception来执行此操作:

import traceback
import tkMessageBox

# You would normally put that on the App class
def show_error(self, *args):
    err = traceback.format_exception(*args)
    tkMessageBox.showerror('Exception',err)
# but this works too
tk.Tk.report_callback_exception = show_error

如果你没有导入’Tkinter as tk’,那么就做

Tkinter.Tk.report_callback_exception = show_error
上一篇:如何在ubuntu 12.10中隐藏g c 11编译警告


下一篇:php – 显示所有错误和警告