1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
| import tkinter as tk from tkinter import ttk, messagebox, scrolledtext import sv_ttk import re
class PerfectAsciiTableGenerator: def __init__(self, root): self.root = root self.root.title("ASCII表格生成器-LSK") self.root.geometry("800x600") sv_ttk.set_theme("light") self.main_frame = ttk.Frame(root, padding="10") self.main_frame.pack(fill=tk.BOTH, expand=True) self.title_frame = ttk.LabelFrame(self.main_frame, text="表格设置", padding="10") self.title_frame.pack(fill=tk.X, pady=(0, 10)) ttk.Label(self.title_frame, text="表格标题:").grid(row=0, column=0, sticky=tk.W) self.title_entry = ttk.Entry(self.title_frame, width=50) self.title_entry.grid(row=0, column=1, padx=5, pady=5, sticky=tk.W) self.title_entry.insert(0, "DW3000 寄存器映射表") self.data_frame = ttk.LabelFrame(self.main_frame, text="表格数据", padding="10") self.data_frame.pack(fill=tk.BOTH, expand=True) ttk.Label(self.data_frame, text="第一行为表头,用制表符或空格分隔列:").pack(anchor=tk.W) self.data_text = scrolledtext.ScrolledText(self.data_frame, height=10) self.data_text.pack(fill=tk.BOTH, expand=True) example_data = """addr\tname\twidth 0x00\tDEV_ID\t32-bit 0x12\tRX_BUFFER_0\t1024-byte""" self.data_text.insert(tk.END, example_data) self.button_frame = ttk.Frame(self.main_frame) self.button_frame.pack(fill=tk.X, pady=(10, 0)) self.generate_btn = ttk.Button(self.button_frame, text="生成表格", command=self.generate_table) self.generate_btn.pack(side=tk.LEFT, padx=5) self.copy_btn = ttk.Button(self.button_frame, text="复制", command=self.copy_to_clipboard) self.copy_btn.pack(side=tk.LEFT, padx=5) self.result_frame = ttk.LabelFrame(self.main_frame, text="生成的表格", padding="10") self.result_frame.pack(fill=tk.BOTH, expand=True) self.result_text = scrolledtext.ScrolledText(self.result_frame, height=15) self.result_text.pack(fill=tk.BOTH, expand=True) self.result_text.config(state=tk.DISABLED) def generate_table(self): try: title = self.title_entry.get() lines = [line.strip() for line in self.data_text.get("1.0", tk.END).split('\n') if line.strip()] if not lines: raise ValueError("请输入至少一行数据") if any('\t' in line for line in lines): sep = '\t' else: sep = ' ' rows = [re.split(r'[\t ]+', line.strip()) for line in lines] headers = rows[0] data_rows = rows[1:] if len(rows) > 1 else [] col_count = len(headers) for i, row in enumerate(rows, 1): if len(row) != col_count: raise ValueError(f"第 {i} 行列数不一致,应为 {col_count} 列,但找到 {len(row)} 列") table = self._create_perfect_table(title, headers, data_rows) self.result_text.config(state=tk.NORMAL) self.result_text.delete("1.0", tk.END) self.result_text.insert(tk.END, table) self.result_text.config(state=tk.DISABLED) except Exception as e: messagebox.showerror("错误", f"生成表格时出错:\n{str(e)}") def _create_perfect_table(self, title, headers, data): borders = { 'tl': '┌', 'tr': '┐', 'bl': '└', 'br': '┘', 'h': '─', 'v': '│', 'lt': '├', 'rt': '┤', 'c': '┼' } col_widths = [ max(max(len(str(item)) for item in col) + 6, 7) for col in zip(headers, *data) ] total_width = sum(col_widths) + (len(col_widths) - 1) lines = [] top_line = borders['tl'] + borders['h'] * total_width + borders['tr'] lines.append(top_line) if title: title_line = borders['v'] + title.center(total_width) + borders['v'] lines.append(title_line) hline = borders['lt'] for i, w in enumerate(col_widths): hline += borders['h'] * w hline += borders['h'] if i < len(col_widths)-1 else borders['rt'] lines.append(hline) header_line = borders['v'] for i, (header, w) in enumerate(zip(headers, col_widths)): header_line += str(header).center(w) header_line += borders['v'] if i < len(headers)-1 else borders['v'] lines.append(header_line) dline = borders['lt'] for i, w in enumerate(col_widths): dline += borders['h'] * w dline += borders['c'] if i < len(col_widths)-1 else borders['rt'] lines.append(dline) for row in data: row_line = borders['v'] for i, (item, w) in enumerate(zip(row, col_widths)): row_line += str(item).center(w) row_line += borders['v'] if i < len(row)-1 else borders['v'] lines.append(row_line) bottom_line = borders['bl'] for i, w in enumerate(col_widths): bottom_line += borders['h'] * w bottom_line += borders['h'] if i < len(col_widths)-1 else borders['br'] lines.append(bottom_line) return '\n'.join(lines) def copy_to_clipboard(self): """将生成的表格复制到剪贴板""" table = self.result_text.get("1.0", tk.END).strip() if table: self.root.clipboard_clear() self.root.clipboard_append(table) messagebox.showinfo("成功", "表格已复制到剪贴板!") else: messagebox.showwarning("警告", "没有可复制的内容!")
if __name__ == "__main__": root = tk.Tk() app = PerfectAsciiTableGenerator(root) root.mainloop()
|