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():
try
:
content
=
input_text.get(
1.0
, tk.END)
if
not
content.strip():
messagebox.showwarning(
"警告"
,
"请先输入内容再转换"
)
return
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):
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
)
paragraph.paragraph_format.line_spacing
=
1.5
continue
if
para.strip():
clean_text
=
re.sub(r
'\*\*(.*?)\*\*'
, r
'\1'
, para)
p
=
doc.add_paragraph()
run
=
p.add_run(clean_text)
set_chinese_font(run,
'宋体'
,
12
)
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
=
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()