ターミナルから次のコードを実行すると、ターミナルに役立つエラー メッセージが表示されます。
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