43 lines
1.8 KiB
Python
43 lines
1.8 KiB
Python
import tkinter as tk
|
|
from tkinter import ttk
|
|
import difflib
|
|
|
|
class DiffViewerDialog(tk.Toplevel):
|
|
def __init__(self, parent, expected: str, actual: str, title: str = "Output Diff"):
|
|
super().__init__(parent)
|
|
self.title(title)
|
|
self.geometry("900x600")
|
|
self.transient(parent)
|
|
self.grab_set()
|
|
|
|
paned = ttk.PanedWindow(self, orient=tk.HORIZONTAL)
|
|
paned.pack(fill="both", expand=True, padx=10, pady=10)
|
|
|
|
left_frame = ttk.Frame(paned)
|
|
right_frame = ttk.Frame(paned)
|
|
paned.add(left_frame, weight=1)
|
|
paned.add(right_frame, weight=1)
|
|
|
|
ttk.Label(left_frame, text="Expected Output", font=("Helvetica", 12, "bold")).pack(anchor="w")
|
|
self.expected_text = tk.Text(left_frame, wrap="word", bg="#f8f8f8")
|
|
self.expected_text.pack(fill="both", expand=True)
|
|
self.expected_text.insert("1.0", expected)
|
|
self.expected_text.configure(state="disabled")
|
|
|
|
ttk.Label(right_frame, text="Actual Output", font=("Helvetica", 12, "bold")).pack(anchor="w")
|
|
self.actual_text = tk.Text(right_frame, wrap="word", bg="#f8f8f8")
|
|
self.actual_text.pack(fill="both", expand=True)
|
|
self.actual_text.insert("1.0", actual)
|
|
self.actual_text.configure(state="disabled")
|
|
|
|
# Diff summary at the bottom
|
|
diff = list(difflib.unified_diff(
|
|
expected.splitlines(), actual.splitlines(), lineterm='', n=3,
|
|
fromfile='expected', tofile='actual'))
|
|
diff_str = '\n'.join(diff) if diff else 'No differences.'
|
|
ttk.Label(self, text="Diff Summary", font=("Helvetica", 11, "bold")).pack(anchor="w", padx=10)
|
|
diff_box = tk.Text(self, height=8, wrap="none", bg="#f0f0f0")
|
|
diff_box.pack(fill="x", padx=10, pady=(0,10))
|
|
diff_box.insert("1.0", diff_str)
|
|
diff_box.configure(state="disabled")
|