import
tkinter as tk
from
tkinter
import
ttk, filedialog, messagebox, scrolledtext
import
tkinter.font as tkFont
from
docx
import
Document
from
datetime
import
datetime
from
docx.oxml.ns
import
qn
from
pathlib
import
Path
import
os
import
json
import
requests
from
requests.exceptions
import
RequestException
class
FontConverterApp:
def
__init__(
self
, root):
self
.root
=
root
self
.current_file
=
None
self
.kangxi_mapping
=
self
.load_kangxi_mapping_from_url()
self
.init_ui()
self
.log(
"程序已启动"
)
def
load_kangxi_mapping_from_url(
self
):
CLOUD_URL
=
".../kangxi_mapping.json"
try
:
response
=
requests.get(CLOUD_URL, timeout
=
5
)
response.raise_for_status()
return
response.json()
except
RequestException as e:
self
.log(f
"字典加载失败: {str(e)}"
)
return
{}
def
convert_kangxi_to_normal(
self
, text):
for
code, mapping
in
self
.kangxi_mapping.items():
text
=
text.replace(mapping[
'radical'
], mapping[
'normal'
])
return
text
def
init_ui(
self
):
self
.root.title(
"大帝清洗器 - 吾爱破解 - 52zuiyun"
)
ttk.Label(
self
.root, text
=
"目标字体:"
).grid(row
=
0
, column
=
0
, padx
=
5
, pady
=
5
)
self
.font_combo
=
ttk.Combobox(
self
.root, values
=
self
.get_system_fonts(), width
=
30
)
self
.font_combo.grid(row
=
0
, column
=
1
, padx
=
5
, pady
=
5
)
ttk.Button(
self
.root, text
=
"选择文件"
, command
=
self
.import_file).grid(row
=
1
, column
=
0
, padx
=
5
, pady
=
5
)
ttk.Button(
self
.root, text
=
"开始转换"
, command
=
self
.convert_font).grid(row
=
1
, column
=
1
, padx
=
5
, pady
=
5
)
self
.log_area
=
scrolledtext.ScrolledText(
self
.root, width
=
60
, height
=
15
)
self
.log_area.grid(row
=
2
, column
=
0
, columnspan
=
2
, padx
=
5
, pady
=
5
)
def
get_system_fonts(
self
):
known_chinese
=
{
'simsun'
,
'simhei'
,
'fangsong'
,
'kaiti'
,
'microsoft yahei'
}
chinese_fonts
=
set
()
for
f
in
tkFont.families():
f_lower
=
f.lower()
if
any
(c
in
f_lower
for
c
in
known_chinese)
or
any
(
'\u4e00'
<
=
c <
=
'\u9fff'
for
c
in
f):
clean_name
=
f.replace(
'@'
, '')
if
clean_name
not
in
chinese_fonts:
chinese_fonts.add(clean_name)
return
sorted
(chinese_fonts)
def
import_file(
self
):
file_path
=
filedialog.askopenfilename(filetypes
=
[(
"Word Files"
,
"*.docx"
)])
if
file_path:
if
not
Path(file_path).exists():
messagebox.showerror(
"错误"
, f
"文件不存在:{file_path}"
)
return
self
.current_file
=
os.path.abspath(file_path)
self
.log(f
"成功导入文件:{self.current_file}"
)
def
convert_font(
self
):
if
not
self
.current_file:
messagebox.showerror(
"错误"
,
"请先选择Word文件"
)
return
font_name
=
self
.font_combo.get()
if
not
font_name:
messagebox.showerror(
"错误"
,
"请选择目标字体"
)
return
try
:
doc
=
Document(
self
.current_file)
for
para
in
doc.paragraphs:
if
self
.kangxi_mapping:
para.text
=
self
.convert_kangxi_to_normal(para.text)
for
run
in
para.runs:
run.font.name
=
font_name
run._element.rPr.rFonts.
set
(qn(
'w:eastAsia'
), font_name)
src_path
=
Path(
self
.current_file)
save_path
=
src_path.parent
/
f
"{src_path.stem}zuiyun{src_path.suffix}"
doc.save(save_path)
self
.log(f
"文件已自动保存到:{save_path}"
)
messagebox.showinfo(
"成功"
, f
"字体转换完成\n保存路径:{save_path}"
)
except
Exception as e:
messagebox.showerror(
"错误"
, f
"转换失败:{str(e)}"
)
self
.log(f
"错误:{str(e)}"
)
def
log(
self
, message):
timestamp
=
datetime.now().strftime(
"%H:%M:%S"
)
self
.log_area.insert(tk.END, f
"[{timestamp}] {message}\n"
)
self
.log_area.see(tk.END)
if
__name__
=
=
"__main__"
:
root
=
tk.Tk()
app
=
FontConverterApp(root)
root.mainloop()