Tkinter でサイレント例外を大音量にするにはどうすればいいですか? 質問する

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 などを公開する標準的な方法はありますか? いたるところに try/except を配置するよりもエレガントな方法を探しています。

編集: 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 は、異なるフレームに異なる例外レポート関数を配置できる可能性について言及しています。その方法がまだわかりません。これは明らかですか?

ベストアンサー1

これを行うにはreport_callback_exception:

import traceback
import tkMessageBox  # py3: import tkinter.messagebox as 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

もしそうしなかったらimport Tkinter as tk

Tkinter.Tk.report_callback_exception = show_error

おすすめ記事