[Python] 纯文本查看 复制代码
import tkinter as tk
from tkinter import scrolledtext, filedialog, messagebox
from docx import Document
from docx.shared import Pt, RGBColor
from docx.enum.text import WD_LINE_SPACING
from docx.oxml.ns import qn
import re
import os
def browse_output_path():
"""打开文件对话框选择保存路径"""
file_path = filedialog.asksaveasfilename(
defaultextension=".docx",
filetypes=[("Word文档", "*.docx"), ("所有文件", "*.*")],
initialfile="deepseek内容转换导出.docx"
)
if file_path:
output_path_var.set(file_path)
def clear_content():
"""清除输入框内容"""
input_text.delete(1.0, tk.END)
status_var.set("内容已清除")
def set_chinese_font(run, font_name, size_pt, bold=False):
"""设置中文字体格式,简化重复代码"""
run.font.name = font_name
run._element.rPr.rFonts.set(qn('w:eastAsia'), font_name)
run.font.size = Pt(size_pt)
run.font.color.rgb = RGBColor(0, 0, 0) # 设置文字颜色为黑色
if bold:
run.font.bold = True
def convert_to_word():
"""将输入框中的Markdown内容转换为Word文档"""
try:
# 获取输入内容
content = input_text.get(1.0, tk.END)
if not content.strip():
messagebox.showwarning("警告", "请先输入内容再转换")
return
# 创建Word文档
doc = Document()
# 按段落分割并处理格式
paragraphs = content.split('\n')
i = 0
while i < len(paragraphs):
para = paragraphs[i]
# 跳过只包含"---"的行
if para.strip() == "---":
i += 1
continue
# 处理标题
if para.startswith('#'):
level = para.count('#')
# 移除#号和**标记
clean_text = para.strip('# ').replace('**', '')
# 添加标题并设置格式
heading = doc.add_heading('', level=level)
run = heading.add_run(clean_text)
# 根据标题级别设置不同格式
if level == 1: # 主标题:黑体四号加粗
set_chinese_font(run, '黑体', 14, bold=True)
else: # 二级及以下标题:加粗宋体小四号
set_chinese_font(run, '宋体', 12, bold=True)
i += 1
continue
# 处理表格
if para.startswith('|') and i + 1 < len(paragraphs) and paragraphs[i + 1].startswith('|'):
# 收集表格行
table_rows = []
while i < len(paragraphs) and paragraphs[i].startswith('|'):
# 跳过分隔行
if '---' in paragraphs[i] and all(c == '-' or c == '|' or c == ' ' for c in paragraphs[i]):
i += 1
continue
# 提取单元格内容
cells = [cell.strip() for cell in paragraphs[i].split('|')[1:-1]]
table_rows.append(cells)
i += 1
if table_rows:
# 创建表格
table = doc.add_table(rows=len(table_rows), cols=len(table_rows[0]))
table.style = 'Table Grid'
# 填充表格内容并设置格式
for row_idx, row in enumerate(table_rows):
for col_idx, cell_content in enumerate(row):
# 移除Markdown格式标记
clean_content = re.sub(r'\*\*(.*?)\*\*', r'\1', cell_content)
# 设置单元格格式
cell = table.cell(row_idx, col_idx)
cell.text = "" # 清空单元格文本
paragraph = cell.paragraphs[0]
run = paragraph.add_run(clean_content)
# 设置表格内文字格式:宋体小四号黑色
set_chinese_font(run, '宋体', 12)
# 设置段落行距为1.5倍
paragraph.paragraph_format.line_spacing = 1.5
continue
# 处理普通段落(非空行)
if para.strip():
# 移除Markdown格式标记
clean_text = re.sub(r'\*\*(.*?)\*\*', r'\1', para)
# 创建段落并设置格式
p = doc.add_paragraph()
run = p.add_run(clean_text)
# 设置正文格式:宋体小四号黑色
set_chinese_font(run, '宋体', 12)
# 设置段落行距为1.5倍
p.paragraph_format.line_spacing = 1.5
i += 1
# 保存文件
output_path = output_path_var.get()
doc.save(output_path)
status_var.set(f"转换成功!文件已保存至: {output_path}")
messagebox.showinfo("成功", f"文档已成功转换并保存至:\n{output_path}")
except Exception as e:
status_var.set(f"转换失败: {str(e)}")
messagebox.showerror("错误", f"转换过程中发生错误:\n{str(e)}")
# 创建主窗口
root = tk.Tk()
root.title("DeepSeek文档转换器")
root.geometry("800x800")
# 创建顶部框架,包含标题和帮助按钮
top_frame = tk.Frame(root)
top_frame.pack(fill=tk.X, padx=20, pady=10)
def show_help():
"""显示帮助信息"""
help_text = """
DeepSeek Markdown 转 Word 文档工具使用指南
基本介绍:
本工具用于将DeepSeek生成的Markdown内容转换为格式化的Word文档,保留原有结构并应用统一的排版格式。
使用步骤:
1. 从DeepSeek复制生成的Markdown内容
2. 粘贴到文本框中
3. 设置保存路径(可选,默认保存在当前目录)
4. 点击"转换为Word文档"按钮
5. 查看转换结果,成功后会显示保存路径
支持的格式:
- 标题(#、##、###等)
- 表格(|分隔的表格)
- 加粗文本(**文本**)
- 普通段落文本
排版格式:
- 主标题:黑体四号(14磅)加粗
- 二级及以下标题:宋体小四号(12磅)加粗
- 正文和表格内容:宋体小四号(12磅)
- 所有文字颜色:黑色
- 段落行距:1.5倍
- 表格样式:网格线
常见问题:
1. 问题:转换后表格格式混乱
解决:确保原始Markdown表格格式正确,包含表头和分隔行
2. 问题:中文字体显示不正确
解决:确保系统安装了宋体和黑体字体
3. 问题:文档无法保存
解决:检查保存路径是否有写入权限,或尝试更改保存位置
"""
help_window = tk.Toplevel(root)
help_window.title("使用帮助")
help_window.geometry("600x500")
help_window.resizable(True, True)
# 添加帮助文本
help_text_widget = scrolledtext.ScrolledText(
help_window,
wrap=tk.WORD,
font=("微软雅黑", 10),
padx=15,
pady=15
)
help_text_widget.pack(fill=tk.BOTH, expand=True)
help_text_widget.insert(tk.END, help_text)
help_text_widget.configure(state="disabled") # 设置为只读
# 添加关闭按钮
close_button = tk.Button(
help_window,
text="关闭",
command=help_window.destroy,
font=("微软雅黑", 10),
padx=10
)
close_button.pack(pady=10)
# 创建标题标签(左对齐)
title_label = tk.Label(
top_frame,
text="DeepSeek Markdown 转 Word 文档工具",
font=("微软雅黑", 16, "bold")
)
title_label.pack(side=tk.LEFT, pady=5)
# 创建帮助按钮(右对齐)
help_button = tk.Button(
top_frame,
text="帮助",
command=show_help,
font=("微软雅黑", 10),
bg="#f0f0f0",
padx=10,
pady=2
)
help_button.pack(side=tk.RIGHT, pady=5)
# 创建说明标签
instruction_label = tk.Label(
root,
text="请将DeepSeek生成的Markdown内容粘贴到下方文本框中:",
font=("微软雅黑", 10)
)
instruction_label.pack(anchor="w", padx=20, pady=(10, 5))
# 创建输入文本框
input_text = scrolledtext.ScrolledText(
root,
wrap=tk.WORD,
font=("微软雅黑", 10),
height=20
)
input_text.pack(fill=tk.BOTH, expand=True, padx=20, pady=10)
# 创建输出路径框架
output_frame = tk.Frame(root)
output_frame.pack(fill=tk.X, padx=20, pady=10)
# 创建输出路径标签
output_label = tk.Label(
output_frame,
text="输出文件路径:",
font=("微软雅黑", 10)
)
output_label.pack(side=tk.LEFT, padx=(0, 10))
# 创建输出路径输入框
output_path_var = tk.StringVar()
output_path_var.set(os.path.join(os.getcwd(), "deepseek内容转换导出.docx"))
output_entry = tk.Entry(
output_frame,
textvariable=output_path_var,
width=50,
font=("微软雅黑", 10)
)
output_entry.pack(side=tk.LEFT, fill=tk.X, expand=True, padx=(0, 10))
# 创建浏览按钮
browse_button = tk.Button(
output_frame,
text="浏览...",
command=browse_output_path,
font=("微软雅黑", 10)
)
browse_button.pack(side=tk.RIGHT)
# 创建按钮框架
button_frame = tk.Frame(root)
button_frame.pack(fill=tk.X, padx=20, pady=10)
# 创建清除按钮
clear_button = tk.Button(
button_frame,
text="清除内容",
command=clear_content,
font=("微软雅黑", 10)
)
clear_button.pack(side=tk.LEFT, padx=5)
# 创建转换按钮
convert_button = tk.Button(
button_frame,
text="转换为Word文档",
command=convert_to_word,
font=("微软雅黑", 10, "bold"),
bg="#4a6fa5",
fg="white",
padx=10,
pady=5
)
convert_button.pack(side=tk.RIGHT, padx=5)
# 创建状态栏
status_var = tk.StringVar()
status_var.set("准备就绪")
status_bar = tk.Label(
root,
textvariable=status_var,
relief=tk.SUNKEN,
anchor=tk.W,
font=("微软雅黑", 9)
)
status_bar.pack(side=tk.BOTTOM, fill=tk.X)
# 启动主循环
root.mainloop()