根据以下代码,进行页面优化,要求能在不联网的win7上运行打包文件import tkinter as tk
from tkinter import ttk, messagebox
import sqlite3
import os
import sys
class FileManagementSystem:
def __init__(self, root):
# 主窗口设置
self.root = root
self.root.title("档案管理系统")
self.root.geometry("1200x700")
self.root.minsize(1000, 600)
# 样式配置 - 重点调整表格边框样式
self.setup_styles()
# 初始化数据库
self.init_database()
# 当前类别
self.current_category = "文书类"
# 创建界面组件
self.create_widgets()
# 加载数据
self.load_data()
def setup_styles(self):
"""设置界面样式,统一表格边框颜色"""
self.style = ttk.Style()
# 基础字体设置,确保中文显示
self.style.configure(".", font=("Microsoft YaHei", 10))
# 窗口背景色
self.root.configure(bg="#f5f5f5")
# 统一按钮样式
self.style.configure("Standard.TButton",
font=("Microsoft YaHei", 10),
padding=6,
background="#4285f4",
foreground="#333333",
borderwidth=0,
width=8)
self.style.map("Standard.TButton",
background=[("active", "#3367d6"), ("pressed", "#2850b3")])
# 表格样式 - 重点调整边框颜色
# 设置表格整体边框颜色
self.style.configure("Flat.Treeview",
background="white",
foreground="#333333",
rowheight=28,
fieldbackground="white",
borderwidth=1,
relief="solid", # 确保边框可见
bd=1) # 表格边框宽度
# 设置表头样式,关键是统一表头下方横线与列间竖线颜色
self.style.configure("Flat.Treeview.Heading",
background="#f0f0f0",
foreground="#555555",
font=("Microsoft YaHei", 10, "bold"),
padding=8,
borderwidth=1, # 表头边框宽度
relief="solid") # 表头边框样式
# 设置表格选中行样式
self.style.map("Flat.Treeview",
background=[("selected", "#e8f0fe")],
foreground=[("selected", "#202124")])
# 设置边框颜色(关键修复)
# 通过设置颜色使表头下方横线与列间竖线颜色一致
self.style.configure("Flat.Treeview", bordercolor="#d0d0d0")
self.style.configure("Flat.Treeview.Heading", bordercolor="#d0d0d0")
# 单选按钮样式
self.style.configure("Flat.TRadiobutton",
background="#f5f5f5",
font=("Microsoft YaHei", 10),
foreground="#333333")
self.style.map("Flat.TRadiobutton",
foreground=[("selected", "#4285f4")])
# 输入框样式
self.style.configure("Uniform.TEntry",
fieldbackground="white",
borderwidth=1,
relief="solid",
padding=5,
width=40)
def init_database(self):
"""初始化数据库"""
if getattr(sys, 'frozen', False):
base_dir = os.path.dirname(sys.executable)
else:
base_dir = os.path.dirname(os.path.abspath(__file__))
db_path = os.path.join(base_dir, "file_management.db")
self.conn = sqlite3.connect(db_path)
self.cursor = self.conn.cursor()
# 创建文书类表
self.cursor.execute('''
CREATE TABLE IF NOT EXISTS documents (
id INTEGER PRIMARY KEY AUTOINCREMENT,
file_number TEXT NOT NULL,
document_number TEXT,
responsible TEXT,
title TEXT NOT NULL,
date TEXT,
security_level TEXT,
page_count INTEGER,
retention_period TEXT,
carrier_form TEXT,
remarks TEXT
)
''')
# 创建基建类表
self.cursor.execute('''
CREATE TABLE IF NOT EXISTS infrastructure (
id INTEGER PRIMARY KEY AUTOINCREMENT,
file_number TEXT NOT NULL,
document_number TEXT,
responsible TEXT,
title TEXT NOT NULL,
date TEXT,
project_date TEXT,
security_level TEXT,
page_count INTEGER,
retention_period TEXT,
carrier_form TEXT,
remarks TEXT
)
''')
self.conn.commit()
def create_widgets(self):
"""创建界面组件"""
# 顶部标题栏
header_frame = tk.Frame(self.root, bg="#4285f4", height=50)
header_frame.pack(fill=tk.X)
header_frame.pack_propagate(False)
title_label = tk.Label(header_frame, text="档案管理系统",
font=("Microsoft YaHei", 16, "bold"),
bg="#4285f4", fg="white")
title_label.pack(pady=10)
# 功能区
function_frame = tk.Frame(self.root, bg="#f5f5f5", padx=20, pady=15)
function_frame.pack(fill=tk.X)
# 左侧分类选择
category_frame = tk.Frame(function_frame, bg="#f5f5f5")
category_frame.pack(side=tk.LEFT)
tk.Label(category_frame, text="档案类别:", font=("Microsoft YaHei", 10, "bold"),
bg="#f5f5f5", fg="#555555").pack(side=tk.LEFT, padx=5)
self.category_var = tk.StringVar(value="文书类")
doc_radio = ttk.Radiobutton(
category_frame, text="文书类", variable=self.category_var,
value="文书类", command=self.on_category_change, style="Flat.TRadiobutton"
)
inf_radio = ttk.Radiobutton(
category_frame, text="基建类", variable=self.category_var,
value="基建类", command=self.on_category_change, style="Flat.TRadiobutton"
)
doc_radio.pack(side=tk.LEFT, padx=10)
inf_radio.pack(side=tk.LEFT, padx=10)
# 右侧操作按钮
button_frame = tk.Frame(function_frame, bg="#f5f5f5")
button_frame.pack(side=tk.RIGHT)
self.add_btn = ttk.Button(button_frame, text="添加", command=self.add_record,
style="Standard.TButton")
self.add_btn.pack(side=tk.LEFT, padx=5)
self.edit_btn = ttk.Button(button_frame, text="修改", command=self.edit_record,
style="Standard.TButton")
self.edit_btn.pack(side=tk.LEFT, padx=5)
self.delete_btn = ttk.Button(button_frame, text="删除", command=self.delete_record,
style="Standard.TButton")
self.delete_btn.pack(side=tk.LEFT, padx=5)
# 搜索区
search_frame = tk.Frame(self.root, bg="#f5f5f5", padx=20, pady=0)
search_frame.pack(fill=tk.X)
search_container = tk.Frame(search_frame, bg="white", bd=1, relief=tk.SOLID)
search_container.pack(fill=tk.X, ipady=2)
tk.Label(search_container, text="搜索:", font=("Microsoft YaHei", 10),
bg="white", fg="#555555").pack(side=tk.LEFT, padx=10)
self.search_var = tk.StringVar()
self.search_entry = ttk.Entry(search_container, textvariable=self.search_var,
style="Uniform.TEntry", font=("Microsoft YaHei", 10))
self.search_entry.pack(side=tk.LEFT, padx=5, fill=tk.X, expand=True)
self.search_btn = ttk.Button(search_container, text="搜索", command=self.search_data,
style="Standard.TButton")
self.search_btn.pack(side=tk.LEFT, padx=10)
self.reset_btn = ttk.Button(search_container, text="重置", command=self.reset_search,
style="Standard.TButton")
self.reset_btn.pack(side=tk.LEFT, padx=5)
# 表格区域
table_frame = tk.Frame(self.root, bg="#e0e0e0", padx=1, pady=1)
table_frame.pack(fill=tk.BOTH, expand=True, padx=20, pady=15)
table_container = tk.Frame(table_frame, bg="white", bd=1, relief=tk.SOLID)
table_container.pack(fill=tk.BOTH, expand=True)
# 滚动条
scrollbar_x = ttk.Scrollbar(table_container, orient=tk.HORIZONTAL)
scrollbar_y = ttk.Scrollbar(table_container, orient=tk.VERTICAL)
# 表格
self.tree = ttk.Treeview(
table_container,
columns=self.get_columns(),
show="headings",
yscrollcommand=scrollbar_y.set,
xscrollcommand=scrollbar_x.set,
style="Flat.Treeview"
)
# 配置列
columns = self.get_columns()
for col in columns:
self.tree.heading(col, text=col)
width = 110 if col not in ["题名", "备注"] else 200 if col == "题名" else 150
self.tree.column(col, width=width, anchor=tk.CENTER, stretch=False)
# 布局
scrollbar_y.pack(side=tk.RIGHT, fill=tk.Y)
scrollbar_x.pack(side=tk.BOTTOM, fill=tk.X)
self.tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
scrollbar_y.config(command=self.tree.yview)
scrollbar_x.config(command=self.tree.xview)
# 绑定事件
self.tree.bind("<Double-1>", lambda e: self.edit_record())
# 页脚
footer_frame = tk.Frame(self.root, bg="#f0f0f0", height=30)
footer_frame.pack(side=tk.BOTTOM, fill=tk.X)
# 左侧状态信息
self.status_var = tk.StringVar(value="记录数量:0")
status_label = tk.Label(
footer_frame,
textvariable=self.status_var,
font=("Microsoft YaHei", 9),
bg="#f0f0f0",
fg="#666666",
anchor=tk.W
)
status_label.pack(side=tk.LEFT, padx=20, pady=5)
# 右侧版权信息
footer_label = tk.Label(
footer_frame,
text="矿调所大数据中心所有 开发人员:袁",
font=("Microsoft YaHei", 9),
bg="#f0f0f0",
fg="#666666"
)
footer_label.pack(side=tk.RIGHT, padx=20, pady=5)
def center_window(self, window, width, height):
"""使窗口居中显示"""
screen_width = window.winfo_screenwidth()
screen_height = window.winfo_screenheight()
x = (screen_width - width) // 2
y = (screen_height - height) // 2
window.geometry(f"{width}x{height}+{x}+{y}")
def get_columns(self):
"""获取当前类别的列"""
if self.current_category == "文书类":
return ["序号", "档号", "文号", "责任者", "题名", "日期",
"密级", "页数", "保存期限", "载体形式", "备注"]
else:
return ["序号", "档号", "文号", "责任者", "题名", "日期",
"工程日期", "密级", "页数", "保管期限", "载体形式", "备注"]
def on_category_change(self):
"""类别改变时更新界面"""
self.current_category = self.category_var.get()
# 清空表格数据
for item in self.tree.get_children():
self.tree.delete(item)
# 重新设置表格列
new_columns = self.get_columns()
self.tree["columns"] = new_columns
# 配置新列
for col in new_columns:
self.tree.heading(col, text=col)
width = 110 if col not in ["题名", "备注"] else 200 if col == "题名" else 150
self.tree.column(col, width=width, anchor=tk.CENTER, stretch=False)
# 重新加载对应类别的数据
self.load_data()
def load_data(self, search_term=None):
"""加载数据"""
# 清空表格
for item in self.tree.get_children():
self.tree.delete(item)
# 根据当前类别查询对应表的数据
if self.current_category == "文书类":
query = """
SELECT id, file_number, document_number, responsible, title, date,
security_level, page_count, retention_period, carrier_form, remarks
FROM documents
"""
count_query = "SELECT COUNT(*) FROM documents"
else:
query = """
SELECT id, file_number, document_number, responsible, title, date, project_date,
security_level, page_count, retention_period, carrier_form, remarks
FROM infrastructure
"""
count_query = "SELECT COUNT(*) FROM infrastructure"
# 添加搜索条件
if search_term:
query += f" WHERE file_number LIKE '%{search_term}%' OR title LIKE '%{search_term}%' OR responsible LIKE '%{search_term}%' OR document_number LIKE '%{search_term}%'"
count_query += f" WHERE file_number LIKE '%{search_term}%' OR title LIKE '%{search_term}%' OR responsible LIKE '%{search_term}%' OR document_number LIKE '%{search_term}%'"
query += " ORDER BY id"
self.cursor.execute(query)
records = self.cursor.fetchall()
# 更新记录数量
self.cursor.execute(count_query)
total_count = self.cursor.fetchone()[0]
self.status_var.set(f"记录数量:{total_count}")
# 插入数据
for i, record in enumerate(records, 1):
values = (i,) + record[1:]
tag = "even" if i % 2 == 0 else "odd"
self.tree.insert("", tk.END, values=values, tags=(record[0], tag))
# 配置行样式
self.tree.tag_configure("odd", background="white")
self.tree.tag_configure("even", background="#fafafa")
def search_data(self):
"""搜索当前类别的数据"""
search_term = self.search_var.get().strip()
self.load_data(search_term)
def reset_search(self):
"""重置搜索"""
self.search_var.set("")
self.load_data()
def add_record(self):
"""添加记录对话框"""
dialog = tk.Toplevel(self.root)
dialog.title(f"添加{self.current_category}记录")
self.center_window(dialog, 620, 520)
dialog.resizable(False, False)
dialog.transient(self.root)
dialog.grab_set()
dialog.configure(bg="#f5f5f5")
# 移除弹框的蓝色边框
dialog.attributes('-alpha', 1.0)
if sys.platform.startswith('win'):
dialog.attributes('-toolwindow', False)
# 标题栏
header = tk.Frame(dialog, bg="#4285f4", height=40)
header.pack(fill=tk.X)
header.pack_propagate(False)
tk.Label(header, text=f"添加{self.current_category}记录",
font=("Microsoft YaHei", 12, "bold"),
bg="#4285f4", fg="white").pack(pady=8)
# 内容区域
content_frame = tk.Frame(dialog, bg="#f5f5f5", padx=20, pady=10)
content_frame.pack(fill=tk.BOTH, expand=True)
# 滚动区域
canvas = tk.Canvas(content_frame, bg="#f5f5f5", bd=0, highlightthickness=0)
scrollbar = ttk.Scrollbar(content_frame, orient="vertical", command=canvas.yview)
scrollable_frame = tk.Frame(canvas, bg="#f5f5f5")
scrollable_frame.bind(
"<Configure>",
lambda e: canvas.configure(scrollregion=canvas.bbox("all"))
)
canvas.create_window((0, 0), window=scrollable_frame, anchor="nw")
canvas.configure(yscrollcommand=scrollbar.set)
canvas.pack(side="left", fill="both", expand=True)
scrollbar.pack(side="right", fill="y")
# 输入字段
entries = {}
columns = self.get_columns()[1:] # 排除序号
for i, col in enumerate(columns):
frame = tk.Frame(scrollable_frame, bg="#f5f5f5", pady=6)
frame.pack(fill=tk.X)
# 标签固定宽度,*放在字段名后面
label_text = f"{col}*" if col in ["档号", "题名"] else col
label_color = "#ea4335" if col in ["档号", "题名"] else "#555555"
tk.Label(frame, text=label_text, width=12, font=("Microsoft YaHei", 10),
bg="#f5f5f5", fg=label_color).pack(side=tk.LEFT, padx=5)
# 输入框容器
entry_container = tk.Frame(frame, bg="white", bd=1, relief=tk.SOLID)
entry_container.pack(side=tk.LEFT, fill=tk.X, expand=True, padx=2)
# 使用统一样式的输入框
entry = ttk.Entry(entry_container, font=("Microsoft YaHei", 10), style="Uniform.TEntry")
entry.pack(fill=tk.X, padx=3, pady=3, ipady=1)
entries[col] = entry
# 按钮区域
btn_frame = tk.Frame(dialog, bg="#f5f5f5", padx=20, pady=15)
btn_frame.pack(fill=tk.X)
ttk.Button(btn_frame, text="保存", command=lambda: self.save_record(entries, dialog, is_new=True),
style="Standard.TButton", width=10).pack(side=tk.LEFT, padx=20)
ttk.Button(btn_frame, text="取消", command=dialog.destroy,
style="Standard.TButton", width=10).pack(side=tk.LEFT)
def edit_record(self):
"""编辑记录对话框"""
selected_items = self.tree.selection()
if not selected_items:
messagebox.showwarning("提示", "请先选择一条记录!")
return
selected_item = selected_items[0]
record_id = self.tree.item(selected_item, "tags")[0]
current_values = self.tree.item(selected_item, "values")
# 创建对话框
dialog = tk.Toplevel(self.root)
dialog.title(f"修改{self.current_category}记录")
self.center_window(dialog, 620, 520)
dialog.resizable(False, False)
dialog.transient(self.root)
dialog.grab_set()
dialog.configure(bg="#f5f5f5")
# 移除弹框的蓝色边框
dialog.attributes('-alpha', 1.0)
if sys.platform.startswith('win'):
dialog.attributes('-toolwindow', False)
# 标题栏
header = tk.Frame(dialog, bg="#4285f4", height=40)
header.pack(fill=tk.X)
header.pack_propagate(False)
tk.Label(header, text=f"修改{self.current_category}记录",
font=("Microsoft YaHei", 12, "bold"),
bg="#4285f4", fg="white").pack(pady=8)
# 内容区域
content_frame = tk.Frame(dialog, bg="#f5f5f5", padx=20, pady=10)
content_frame.pack(fill=tk.BOTH, expand=True)
# 滚动区域
canvas = tk.Canvas(content_frame, bg="#f5f5f5", bd=0, highlightthickness=0)
scrollbar = ttk.Scrollbar(content_frame, orient="vertical", command=canvas.yview)
scrollable_frame = tk.Frame(canvas, bg="#f5f5f5")
scrollable_frame.bind(
"<Configure>",
lambda e: canvas.configure(scrollregion=canvas.bbox("all"))
)
canvas.create_window((0, 0), window=scrollable_frame, anchor="nw")
canvas.configure(yscrollcommand=scrollbar.set)
canvas.pack(side="left", fill="both", expand=True)
scrollbar.pack(side="right", fill="y")
# 输入字段
entries = {}
columns = self.get_columns()[1:] # 排除序号
for i, col in enumerate(columns):
frame = tk.Frame(scrollable_frame, bg="#f5f5f5", pady=6)
frame.pack(fill=tk.X)
# 标签固定宽度,*放在字段名后面
label_text = f"{col}*" if col in ["档号", "题名"] else col
label_color = "#ea4335" if col in ["档号", "题名"] else "#555555"
tk.Label(frame, text=label_text, width=12, font=("Microsoft YaHei", 10),
bg="#f5f5f5", fg=label_color).pack(side=tk.LEFT, padx=5)
# 输入框容器
entry_container = tk.Frame(frame, bg="white", bd=1, relief=tk.SOLID)
entry_container.pack(side=tk.LEFT, fill=tk.X, expand=True, padx=2)
# 使用统一样式的输入框
entry = ttk.Entry(entry_container, font=("Microsoft YaHei", 10), style="Uniform.TEntry")
entry.pack(fill=tk.X, padx=3, pady=3, ipady=1)
entries[col] = entry
# 填充现有值
if i < len(current_values) - 1:
entry.insert(0, current_values[i + 1])
# 按钮区域
btn_frame = tk.Frame(dialog, bg="#f5f5f5", padx=20, pady=15)
btn_frame.pack(fill=tk.X)
ttk.Button(btn_frame, text="保存",
command=lambda: self.save_record(entries, dialog, is_new=False, record_id=record_id),
style="Standard.TButton", width=10).pack(side=tk.LEFT, padx=20)
ttk.Button(btn_frame, text="取消", command=dialog.destroy,
style="Standard.TButton", width=10).pack(side=tk.LEFT)
def save_record(self, entries, dialog, is_new=True, record_id=None):
"""保存记录(新增或修改)"""
# 收集数据
data = {}
for col, entry in entries.items():
data[col] = entry.get().strip()
# 验证
if not data["档号"]:
messagebox.showerror("错误", "档号不能为空!")
return
if not data["题名"]:
messagebox.showerror("错误", "题名不能为空!")
return
try:
if is_new:
# 新增记录到当前类别的对应表
if self.current_category == "文书类":
self.cursor.execute('''
INSERT INTO documents
(file_number, document_number, responsible, title, date,
security_level, page_count, retention_period, carrier_form, remarks)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
''', (
data["档号"], data["文号"], data["责任者"], data["题名"], data["日期"],
data["密级"], data["页数"] if data["页数"] else None,
data["保存期限"], data["载体形式"], data["备注"]
))
else:
self.cursor.execute('''
INSERT INTO infrastructure
(file_number, document_number, responsible, title, date, project_date,
security_level, page_count, retention_period, carrier_form, remarks)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
''', (
data["档号"], data["文号"], data["责任者"], data["题名"], data["日期"],
data["工程日期"], data["密级"],
data["页数"] if data["页数"] else None,
data["保管期限"], data["载体形式"], data["备注"]
))
else:
# 修改当前类别对应表中的记录
if self.current_category == "文书类":
self.cursor.execute('''
UPDATE documents SET
file_number = ?, document_number = ?, responsible = ?, title = ?, date = ?,
security_level = ?, page_count = ?, retention_period = ?, carrier_form = ?, remarks = ?
WHERE id = ?
''', (
data["档号"], data["文号"], data["责任者"], data["题名"], data["日期"],
data["密级"], data["页数"] if data["页数"] else None,
data["保存期限"], data["载体形式"], data["备注"],
record_id
))
else:
self.cursor.execute('''
UPDATE infrastructure SET
file_number = ?, document_number = ?, responsible = ?, title = ?, date = ?, project_date = ?,
security_level = ?, page_count = ?, retention_period = ?, carrier_form = ?, remarks = ?
WHERE id = ?
''', (
data["档号"], data["文号"], data["责任者"], data["题名"], data["日期"],
data["工程日期"], data["密级"],
data["页数"] if data["页数"] else None,
data["保管期限"], data["载体形式"], data["备注"],
record_id
))
self.conn.commit()
dialog.destroy()
self.load_data()
messagebox.showinfo("成功", "记录保存成功!")
except Exception as e:
messagebox.showerror("错误", f"保存失败:{str(e)}")
def delete_record(self):
"""删除记录"""
selected_items = self.tree.selection()
if not selected_items:
messagebox.showwarning("提示", "请先选择一条记录!")
return
if messagebox.askyesno("确认删除", "确定要删除选中的记录吗?\n此操作不可恢复。"):
selected_item = selected_items[0]
record_id = self.tree.item(selected_item, "tags")[0]
try:
if self.current_category == "文书类":
self.cursor.execute("DELETE FROM documents WHERE id = ?", (record_id,))
else:
self.cursor.execute("DELETE FROM infrastructure WHERE id = ?", (record_id,))
self.conn.commit()
self.load_data()
messagebox.showinfo("成功", "记录已删除")
except Exception as e:
messagebox.showerror("错误", f"删除失败:{str(e)}")
if __name__ == "__main__":
root = tk.Tk()
app = FileManagementSystem(root)
root.mainloop()