gpt4 book ai didi

python - 如何将 "show details"按钮添加到 tkinter 消息框?

转载 作者:太空狗 更新时间:2023-10-29 20:23:36 24 4
gpt4 key购买 nike

我有一个 Python 脚本,它使用 tkinter.messagebox 在发生意外异常时显示带有回溯详细信息的错误消息。

import tkinter.messagebox as tm
import traceback

try:
1/0
except Exception as error:
tm.showerror(title="Error",
message="An error has occurred: '" + str(error) + "'.",
detail=traceback.format_exc())

Standard tkinter error

以这种方式显示回溯有一些缺点。

我不想默认显示错误详细信息,而是想添加一个“显示详细信息”按钮,它会在只读文本字段中显示更多信息。

Detailed error for "division by zero"

如何向 tkinter 消息框添加“显示详细信息”按钮?

最佳答案

我会使用 Toplevel() 窗口来构建我自己的客户错误框。

我认为在这里使用 ttk 按钮是个好主意,结合框架和权重,我们可以让窗口看起来足够体面。

为了防止用户调整窗口大小,我还必须设置一种方法来切换详细信息文本框。使用跟踪变量和使用 if/else 语句,设置起来很容易。

最后,我们可以使用 .config(state="disabled") 禁用文本框

import tkinter as tk
import tkinter.ttk as ttk
import traceback


class MyApp(tk.Tk):
def __init__(self):
super().__init__()
tk.Button(self, text='test error', command=self.run_bad_math).pack()

@staticmethod
def run_bad_math():
try:
1/0
except Exception as error:
title = 'Traceback Error'
message = "An error has occurred: '{}'.".format(error)
detail = traceback.format_exc()
TopErrorWindow(title, message, detail)


class TopErrorWindow(tk.Toplevel):
def __init__(self, title, message, detail):
tk.Toplevel.__init__(self)
self.details_expanded = False
self.title(title)
self.geometry('350x75')
self.minsize(350, 75)
self.maxsize(425, 250)
self.rowconfigure(0, weight=0)
self.rowconfigure(1, weight=1)
self.columnconfigure(0, weight=1)

button_frame = tk.Frame(self)
button_frame.grid(row=0, column=0, sticky='nsew')
button_frame.columnconfigure(0, weight=1)
button_frame.columnconfigure(1, weight=1)

text_frame = tk.Frame(self)
text_frame.grid(row=1, column=0, padx=(7, 7), pady=(7, 7), sticky='nsew')
text_frame.rowconfigure(0, weight=1)
text_frame.columnconfigure(0, weight=1)

ttk.Label(button_frame, text=message).grid(row=0, column=0, columnspan=2, pady=(7, 7))
ttk.Button(button_frame, text='OK', command=self.destroy).grid(row=1, column=0, sticky='e')
ttk.Button(button_frame, text='Details', command=self.toggle_details).grid(row=1, column=1, sticky='w')

self.textbox = tk.Text(text_frame, height=6)
self.textbox.insert('1.0', detail)
self.textbox.config(state='disabled')
self.scrollb = tk.Scrollbar(text_frame, command=self.textbox.yview)
self.textbox.config(yscrollcommand=self.scrollb.set)

def toggle_details(self):
if self.details_expanded:
self.textbox.grid_forget()
self.scrollb.grid_forget()
self.geometry('350x75')
self.details_expanded = False
else:
self.textbox.grid(row=0, column=0, sticky='nsew')
self.scrollb.grid(row=0, column=1, sticky='nsew')
self.geometry('350x160')
self.details_expanded = True


if __name__ == '__main__':
App = MyApp().mainloop()

结果:

enter image description here

enter image description here

现在可以调整大小 :D

enter image description here

更新:

回应您的以下声明:

The error window will not display if a Tk instance hasn't been initialized first.

如果我们将类设置为它自己的 Tk() 实例,它可以用作独立的错误弹出窗口。我还添加了一些对齐更改和一些调整大小控件,以使此类更符合您在评论中提到的标准错误消息。

见下面的代码。

import tkinter as tk
import tkinter.ttk as ttk


class TopErrorWindow(tk.Tk):
def __init__(self, title, message, detail):
super().__init__()
self.details_expanded = False
self.title(title)
self.geometry('350x75')
self.minsize(350, 75)
self.maxsize(425, 250)
self.resizable(False, False)
self.rowconfigure(0, weight=0)
self.rowconfigure(1, weight=1)
self.columnconfigure(0, weight=1)

button_frame = tk.Frame(self)
button_frame.grid(row=0, column=0, sticky='nsew')
button_frame.columnconfigure(0, weight=1)
button_frame.columnconfigure(1, weight=1)

text_frame = tk.Frame(self)
text_frame.grid(row=1, column=0, padx=(7, 7), pady=(7, 7), sticky='nsew')
text_frame.rowconfigure(0, weight=1)
text_frame.columnconfigure(0, weight=1)

ttk.Label(button_frame, text=message).grid(row=0, column=0, columnspan=3, pady=(7, 7), padx=(7, 7), sticky='w')
ttk.Button(button_frame, text='OK', command=self.destroy).grid(row=1, column=1, sticky='e')
ttk.Button(button_frame, text='Details',
command=self.toggle_details).grid(row=1, column=2, padx=(7, 7), sticky='e')

self.textbox = tk.Text(text_frame, height=6)
self.textbox.insert('1.0', detail)
self.textbox.config(state='disabled')
self.scrollb = tk.Scrollbar(text_frame, command=self.textbox.yview)
self.textbox.config(yscrollcommand=self.scrollb.set)
self.mainloop()

def toggle_details(self):
if self.details_expanded:
self.textbox.grid_forget()
self.scrollb.grid_forget()
self.resizable(False, False)
self.geometry('350x75')
self.details_expanded = False
else:
self.textbox.grid(row=0, column=0, sticky='nsew')
self.scrollb.grid(row=0, column=1, sticky='nsew')
self.resizable(True, True)
self.geometry('350x160')
self.details_expanded = True

结果:

enter image description here

enter image description here

您也可以使用带有所需错误图像类型的 Canvas 添加图像。

关于python - 如何将 "show details"按钮添加到 tkinter 消息框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49072942/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com