import
os
from
datetime
import
datetime
import
tkinter as tk
from
tkinter
import
ttk
from
tkinter
import
filedialog, messagebox
import
pandas as pd
class
VerifyFilesApp:
def
__init__(
self
, master):
self
.master
=
master
master.title(
'文件路径验证工具V1.1 by来乐老弟'
)
self
.file_frame
=
ttk.LabelFrame(master, text
=
'文件选择'
, padding
=
10
)
self
.file_frame.grid(row
=
0
, column
=
0
, columnspan
=
3
, padx
=
10
, pady
=
5
, sticky
=
'ew'
)
self
.file_label
=
tk.Label(
self
.file_frame, text
=
'Excel文件:'
)
self
.file_label.grid(row
=
0
, column
=
0
, padx
=
5
, pady
=
5
)
self
.file_entry
=
tk.Entry(
self
.file_frame, width
=
40
)
self
.file_entry.grid(row
=
0
, column
=
1
, padx
=
5
, pady
=
5
)
self
.file_btn
=
tk.Button(
self
.file_frame, text
=
'选择...'
, command
=
self
.select_file)
self
.file_btn.grid(row
=
0
, column
=
2
, padx
=
5
, pady
=
5
)
self
.column_label
=
tk.Label(
self
.file_frame, text
=
'对比列:'
)
self
.column_label.grid(row
=
1
, column
=
0
, padx
=
5
, pady
=
5
)
self
.column_combobox
=
ttk.Combobox(
self
.file_frame, width
=
37
)
self
.column_combobox.grid(row
=
1
, column
=
1
, padx
=
5
, pady
=
5
, columnspan
=
2
, sticky
=
'ew'
)
self
.control_frame
=
ttk.Frame(master, padding
=
10
)
self
.control_frame.grid(row
=
1
, column
=
0
, columnspan
=
3
, padx
=
10
, pady
=
5
, sticky
=
'ew'
)
self
.verify_btn
=
tk.Button(
self
.control_frame, text
=
'开始验证'
, command
=
self
.start_verification)
self
.verify_btn.pack(side
=
'left'
, padx
=
5
)
self
.save_btn
=
tk.Button(
self
.control_frame, text
=
'保存日志'
, command
=
self
.save_log)
self
.save_btn.pack(side
=
'left'
, padx
=
5
)
self
.log_frame
=
ttk.LabelFrame(master, text
=
'验证日志'
, padding
=
10
)
self
.log_frame.grid(row
=
2
, column
=
0
, columnspan
=
3
, padx
=
10
, pady
=
5
, sticky
=
'nsew'
)
self
.log_text
=
tk.Text(
self
.log_frame, wrap
=
tk.WORD, font
=
(
'Arial'
,
10
))
self
.log_text.pack(fill
=
'both'
, expand
=
True
)
master.grid_rowconfigure(
2
, weight
=
1
)
master.grid_columnconfigure(
0
, weight
=
1
)
self
.log_text.tag_configure(
'valid'
, foreground
=
'green'
)
self
.log_text.tag_configure(
'invalid'
, foreground
=
'red'
)
self
.menu_bar
=
tk.Menu(master)
self
.help_menu
=
tk.Menu(
self
.menu_bar, tearoff
=
0
)
self
.help_menu.add_command(label
=
'使用帮助'
, command
=
self
.show_help)
self
.menu_bar.add_cascade(label
=
'帮助'
, menu
=
self
.help_menu)
master.config(menu
=
self
.menu_bar)
def
select_file(
self
):
filename
=
filedialog.askopenfilename(title
=
'选择Excel文件'
, filetypes
=
[(
'Excel文件'
,
'*.xlsx'
)])
if
filename:
self
.file_entry.delete(
0
, tk.END)
self
.file_entry.insert(
0
, filename)
try
:
df
=
pd.read_excel(filename)
self
.column_combobox[
'values'
]
=
df.columns.tolist()
self
.column_combobox.current(
0
)
self
.log_text.delete(
1.0
, tk.END)
self
.log_text.insert(tk.END,
'文件预览:\n'
)
self
.log_text.insert(tk.END, df.to_string(index
=
False
)
+
'\n\n'
)
except
Exception as e:
messagebox.showerror(
'错误'
, f
'读取Excel文件失败:{str(e)}'
)
def
save_log(
self
):
filename
=
filedialog.asksaveasfilename(title
=
'保存日志文件'
, defaultextension
=
'.txt'
, filetypes
=
[(
'Text Files'
,
'*.txt'
)])
if
filename:
try
:
with
open
(filename,
'w'
, encoding
=
'utf-8'
) as f:
f.write(
self
.log_text.get(
1.0
, tk.END))
messagebox.showinfo(
'成功'
,
'日志已成功保存'
)
except
Exception as e:
messagebox.showerror(
'错误'
, f
'保存日志失败:{str(e)}'
)
def
start_verification(
self
):
file_path
=
self
.file_entry.get()
column_name
=
self
.column_combobox.get()
if
not
file_path
or
not
column_name:
messagebox.showerror(
'错误'
,
'请选择Excel文件和对比列'
)
return
try
:
df
=
pd.read_excel(file_path)
file_names
=
df[column_name].dropna().tolist()
file_names
=
[file_name.strip()
for
file_name
in
file_names
if
isinstance
(file_name,
str
)
and
file_name.strip()]
folder_path
=
os.path.dirname(file_path)
self
.log_text.delete(
1.0
, tk.END)
self
.log_text.insert(tk.END,
'验证时间: '
+
datetime.now().strftime(
'%Y-%m-%d %H:%M:%S'
)
+
'\n'
)
total_count
=
len
(file_names)
valid_count
=
0
for
idx, file_name
in
enumerate
(file_names,
1
):
try
:
exists
=
os.path.exists(os.path.join(folder_path, file_name))
status
=
'存在'
if
exists
else
'不存在'
if
exists:
valid_count
+
=
1
self
.log_text.insert(tk.END, f
'{idx}. 文件名: {file_name} - {status}\n'
,
'valid'
if
status
=
=
'存在'
else
'invalid'
)
except
Exception as e:
self
.log_text.insert(tk.END, f
'{idx}. 文件名: {file_name} - 错误: {str(e)}\n'
)
self
.log_text.insert(tk.END,
'\n验证结果:\n'
)
self
.log_text.insert(tk.END, f
'总计:{total_count} 条路径\n'
)
self
.log_text.insert(tk.END, f
'有效路径:{valid_count} 条\n'
)
self
.log_text.insert(tk.END, f
'无效路径:{total_count - valid_count} 条\n'
)
messagebox.showinfo(
'验证结果'
, f
'总计:{total_count} 条路径\n有效路径:{valid_count} 条\n无效路径:{total_count - valid_count} 条'
)
except
Exception as e:
messagebox.showerror(
'错误'
, f
'验证过程中发生错误:{str(e)}'
)
def
show_help(
self
):
help_text
=
messagebox.showinfo(
'使用帮助'
, help_text)
if
__name__
=
=
'__main__'
:
root
=
tk.Tk()
app
=
VerifyFilesApp(root)
root.mainloop()