当前位置: 首页 > 面试题库 >

如何在tkinter中更大声地使无声异常发生?

郎琪
2023-03-14
问题内容

如果我从终端运行以下代码,则会在终端中收到有用的错误消息:

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


 类似资料:
  • 问题内容: 我们总是写: 题: 是在类中声明 常量 的唯一方法吗? 如果我改写的话,它还是一个 常量 还是一个 实例字段 ? 什么是 实例变量 ? 实例变量 和 实例字段有 什么区别? 问题答案: 您可以在Java 5及更高版本中使用一种类型,以达到您描述的目的。这是类型安全的。 A是一个实例变量。(如果它具有static修饰符,则它将成为一个静态变量。)常量仅表示该值不变。 实例变量是属于对象而

  • 问题内容: 我有这些值来自测试 我尝试 我得到了,关于调试是。 我怎样才能断言超越使用条件 问题答案: 只是您的操作方式。还有一个过载,如果发生故障,消息是;如果要打印某某某物的大小不超过某某某物的大小,则可以使用它。 您也可以添加依赖项以使用匹配器。参见https://code.google.com/p/hamcrest/wiki/Tutorial: 这给出了类似的错误:

  • 我试图在react类中实现datepicker,在这个过程中,我在react类中声明了const,我正在处理这个类,并且得到了解析错误。有人能帮个忙吗申报有什么问题吗? 我得到下面的错误。 未能编译/src/组件/类别。js行11:9:解析错误:意外标记 9 |类别类别。组件{10| 11|const date=useState(new Date()); | ^ 12| 13|构造函数(props

  • 声明运行时异常的方法的指导原则是什么? 假设我调用一个抛出的第三方例程。该例程能够抛出而不声明它这样做是否允许/标准/可接受? 和往常一样,我对我的问题引起的困惑感到惊讶:-D这可能是因为我很困惑。 在下面的代码中,可调用的是一个lambda,它发出一个,这会抛出SQLException。callable.call抛出Exception。 我由此推测,程序员希望抛出一个SQLException。然

  • 问题内容: 我试图在Go中声明为constant,但是它抛出一个错误。有人可以在Go中声明常量的语法帮助我吗? 这是我的代码: 这是错误 问题答案: 您的语法不正确。要制作文字映射(作为伪常量),可以执行以下操作: 在a中,您可以这样声明: 在Go中,没有常量映射之类的东西。可以在 此处 找到更多信息。 在Go游乐场尝试一下。

  • 问题内容: 我希望每当用户超过的最大字符限制时,我的网页都会发出蜂鸣声。 问题答案: 无法直接在JavaScript中进行操作。您需要在HTML中嵌入一个简短的WAV文件,然后通过代码进行播放。 一个例子: 然后,您可以这样从JavaScript代码中调用它: 这应该完全满足您的要求-您只需要自己查找/创建蜂鸣声,这应该是微不足道的。