ASCII表格生成器

6.5k words

在写代码时有时要在代码中插入表格,手写太麻烦,所以使用 Python 的 Tkinter 开发了一个功能齐全、可自定义的 ASCII 表格生成器上位机工具

一、效果展示

1、在文本中的效果:

1
2
3
4
5
6
7
8
┌────────────────────────────────────────────┐
│ DW3000 寄存器映射表 │
├────────────────────────────────────────────┤
│ addr │ name │ width │
├──────────┼─────────────────┼───────────────┤
0x00 │ DEV_ID │ 32-bit │
0x12 │ RX_BUFFER_0 │ 1024-byte │
└────────────────────────────────────────────┘

2、上位机界面效果:

二、操作

1、直接使用exe文件

百度网盘链接如下:

1
2
3
通过网盘分享的文件:ASCII表格生成器
链接: https://pan.baidu.com/s/1GY5-F0Ha-sWsSDttyw6aCw?pwd=kcy4 提取码: kcy4
--来自百度网盘超级会员v5的分享

2、使用源码编译方法(源码见附录)

首先安装Python,执行以下指令安装所需要的python库:

1
2
3
4
5
// 安装GUI库
pip install sv_ttk -i https://pypi.tuna.tsinghua.edu.cn/simple/

// 安装打包所需要的库
pip install sv_ttk -i https://pypi.tuna.tsinghua.edu.cn/simple/

执行打包命令:

1
2
// 其中my.ico为应用图标
pyinstaller -F -w -i my.ico --hidden-import numpy tool.py

三、附录:

1、源码

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")

# 应用Sun Valley主题
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': '┼' # 交叉
}

# 计算每列宽度(内容+6保证两侧各3空格)
col_widths = [
max(max(len(str(item)) for item in col) + 6, 7) # 最小宽度为7
for col in zip(headers, *data)
]

# 计算总宽度(列宽之和 + 列间垂直线)
total_width = sum(col_widths) + (len(col_widths) - 1)

lines = []

# 1. 顶部边框
top_line = borders['tl'] + borders['h'] * total_width + borders['tr']
lines.append(top_line)

# 2. 标题行
if title:
title_line = borders['v'] + title.center(total_width) + borders['v']
lines.append(title_line)

# 3. 表头分隔线
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)

# 4. 表头行
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)

# 5. 数据分隔线(带交叉)
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)

# 6. 数据行
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)

# 7. 底部边框
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()

# pyinstaller -F -w -i my.ico --hidden-import numpy tool.py

欢迎关注微信公众号: