根据以下代码进行界面优化,要求:1、数据量多可以进行分页展示 2、添加档案和编辑档案的页面中,左列字段靠弹窗左侧,右列的字段靠弹框右侧,布局根据弹框大小调整 3、搜索结果提示搜索出多少条。其他功能保持不变,页面UI进行适度优化,兼容不联网的win7系统。请给出完整代码。import tkinter as tk
from tkinter import ttk, messagebox
import sqlite3
import os
import sys
import traceback
class FileManagementSystem:
def __init__(self, root):
# 主窗口设置
self.root = root
self.root.title("档案管理系统")
self.root.geometry("1200x750")
self.root.minsize(1000, 650)
self.root.configure(bg="#f0f2f5")
# 设置应用程序图标
self.set_app_icon()
# 样式配置
self.setup_styles()
# 初始化数据库
self.init_database()
# 当前类别
self.current_category = "文书类"
# 创建界面组件
self.create_widgets()
# 加载数据
self.load_data()
def set_app_icon(self):
"""设置应用程序图标(如果有图标文件)"""
try:
if getattr(sys, 'frozen', False):
base_dir = os.path.dirname(sys.executable)
else:
base_dir = os.path.dirname(os.path.abspath(__file__))
icon_path = os.path.join(base_dir, "archive_icon.ico")
if os.path.exists(icon_path):
self.root.iconbitmap(icon_path)
except:
pass
def setup_styles(self):
"""设置现代化界面样式"""
self.style = ttk.Style()
# 基础字体设置
self.style.configure(".", font=("Microsoft YaHei", 10))
# 主题配置
self.style.theme_use("clam")
# 统一按钮样式
self.style.configure("Primary.TButton",
font=("Microsoft YaHei", 10),
padding=8,
background="#4285f4",
foreground="white",
borderwidth=1,
relief="flat",
width=10)
self.style.map("Primary.TButton",
background=[("active", "#3367d6"), ("pressed", "#2850b3")])
# 删除按钮使用不同颜色
self.style.configure("Danger.TButton",
font=("Microsoft YaHei", 10),
padding=8,
background="#ea4335",
foreground="white",
borderwidth=1,
relief="flat",
width=10)
self.style.map("Danger.TButton",
background=[("active", "#d93025"), ("pressed", "#b31412")])
# 表格样式
self.style.configure("Treeview",
background="white",
foreground="#202124",
rowheight=30,
fieldbackground="white",
borderwidth=1,
relief="solid")
self.style.configure("Treeview.Heading",
background="#f8f9fa",
foreground="#5f6368",
font=("Microsoft YaHei", 10, "bold"),
padding=8,
relief="flat")
self.style.map("Treeview.Heading",
background=[("active", "#e8eaed")])
self.style.map("Treeview",
background=[("selected", "#e8f0fe")],
foreground=[("selected", "#202124")])
# 单选按钮样式
self.style.configure("TRadiobutton",
background="#f0f2f5",
font=("Microsoft YaHei", 10),
foreground="#5f6368")
self.style.map("TRadiobutton",
foreground=[("selected", "#4285f4")])
# 输入框样式
self.style.configure("TEntry",
fieldbackground="white",
borderwidth=1,
relief="solid",
padding=5)
# 必填输入框样式
self.style.configure("Required.TEntry",
fieldbackground="#fff8f8",
borderwidth=1,
relief="solid",
padding=5)
# 标签样式
self.style.configure("Header.TLabel",
font=("Microsoft YaHei", 16, "bold"),
background="#4285f4",
foreground="white")
self.style.configure("Section.TLabel",
font=("Microsoft YaHei", 10, "bold"),
background="#f0f2f5",
foreground="#5f6368")
def init_database(self):
"""初始化数据库,处理打包路径问题"""
try:
# 获取可执行文件所在目录(打包后)
if getattr(sys, 'frozen', False):
base_dir = os.path.dirname(sys.executable)
else:
base_dir = os.path.dirname(os.path.abspath(__file__))
# 确保目录存在
os.makedirs(base_dir, exist_ok=True)
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()
except Exception as e:
messagebox.showerror("数据库错误", f"初始化数据库失败: {str(e)}")
traceback.print_exc()
sys.exit(1)
def create_widgets(self):
"""创建现代化界面组件"""
# 主布局容器
main_frame = tk.Frame(self.root, bg="#f0f2f5")
main_frame.pack(fill=tk.BOTH, expand=True, padx=20, pady=15)
# 顶部标题栏
header_frame = tk.Frame(main_frame, bg="#4285f4", height=60)
header_frame.pack(fill=tk.X)
header_frame.pack_propagate(False)
title_label = tk.Label(header_frame, text="档案管理系统",
font=("Microsoft YaHei", 18, "bold"),
bg="#4285f4", fg="white")
title_label.pack(pady=15)
# 功能区
function_frame = tk.Frame(main_frame, bg="#f0f2f5", pady=15)
function_frame.pack(fill=tk.X)
# 左侧分类选择
category_frame = tk.Frame(function_frame, bg="#f0f2f5")
category_frame.pack(side=tk.LEFT, padx=(0, 20))
ttk.Label(category_frame, text="档案类别:",
style="Section.TLabel").pack(side=tk.LEFT, padx=5)
self.category_var = tk.StringVar(value="文书类")
category_container = tk.Frame(category_frame, bg="#f0f2f5")
category_container.pack(side=tk.LEFT)
doc_radio = ttk.Radiobutton(
category_container, text="文书类", variable=self.category_var,
value="文书类", command=self.on_category_change, style="TRadiobutton"
)
inf_radio = ttk.Radiobutton(
category_container, text="基建类", variable=self.category_var,
value="基建类", command=self.on_category_change, style="TRadiobutton"
)
doc_radio.pack(side=tk.LEFT, padx=10)
inf_radio.pack(side=tk.LEFT, padx=10)
# 搜索区
search_frame = tk.Frame(function_frame, bg="#f0f2f5")
search_frame.pack(side=tk.LEFT, fill=tk.X, expand=True, padx=(0, 20))
ttk.Label(search_frame, text="搜索:",
style="Section.TLabel").pack(side=tk.LEFT, padx=5)
self.search_var = tk.StringVar()
self.search_entry = ttk.Entry(search_frame, textvariable=self.search_var,
style="TEntry", font=("Microsoft YaHei", 10))
self.search_entry.pack(side=tk.LEFT, padx=5, fill=tk.X, expand=True, ipady=2)
self.search_entry.bind("<Return>", lambda event: self.search_data())
# 右侧操作按钮
button_frame = tk.Frame(function_frame, bg="#f0f2f5")
button_frame.pack(side=tk.RIGHT)
self.add_btn = ttk.Button(button_frame, text="添加档案", command=self.add_record,
style="Primary.TButton")
self.add_btn.pack(side=tk.LEFT, padx=5)
self.edit_btn = ttk.Button(button_frame, text="修改档案", command=self.edit_record,
style="Primary.TButton")
self.edit_btn.pack(side=tk.LEFT, padx=5)
self.delete_btn = ttk.Button(button_frame, text="删除档案", command=self.delete_record,
style="Danger.TButton")
self.delete_btn.pack(side=tk.LEFT, padx=5)
# 表格区域
table_frame = tk.Frame(main_frame, bg="#e0e0e0", padx=1, pady=1)
table_frame.pack(fill=tk.BOTH, expand=True)
# 表格标题栏
table_header = tk.Frame(table_frame, bg="#f8f9fa", height=40)
table_header.pack(fill=tk.X)
table_header.pack_propagate(False)
self.table_title = tk.Label(table_header, text=f"{self.current_category}档案列表",
font=("Microsoft YaHei", 11, "bold"),
bg="#f8f9fa", fg="#5f6368")
self.table_title.pack(side=tk.LEFT, padx=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="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(main_frame, bg="#f0f2f5", height=30)
footer_frame.pack(fill=tk.X, pady=(10, 0))
# 左侧状态信息
self.status_var = tk.StringVar(value="记录数量:0")
status_label = tk.Label(
footer_frame,
textvariable=self.status_var,
font=("Microsoft YaHei", 9),
bg="#f0f2f5",
fg="#666666",
anchor=tk.W
)
status_label.pack(side=tk.LEFT, padx=20, pady=5)
# 右侧版权信息
footer_label = tk.Label(
footer_frame,
text="矿调所大数据中心 © 2023 开发人员:袁",
font=("Microsoft YaHei", 9),
bg="#f0f2f5",
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 - 20 # 稍微上移一点
window.geometry(f"{width}x{height}+{x}+{y}")
window.focus_set()
def get_columns(self):
"""获取当前类别的列"""
if self.current_category == "文书类":
return ["序号", "档号", "文号", "责任者", "题名", "日期",
"密级", "页数", "保存期限", "载体形式", "备注"]
else:
return ["序号", "档号", "文号", "责任者", "题名", "日期",
"工程日期", "密级", "页数", "保管期限", "载体形式", "备注"]
def on_category_change(self):
"""类别改变时更新界面"""
self.current_category = self.category_var.get()
# 更新表格标题
self.table_title.config(text=f"{self.current_category}档案列表")
# 清空表格数据
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):
"""加载数据,使用参数化查询防止SQL注入"""
try:
# 清空表格
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"
# 添加搜索条件
params = ()
if search_term:
query += " WHERE file_number LIKE ? OR title LIKE ? OR responsible LIKE ? OR document_number LIKE ?"
count_query += " WHERE file_number LIKE ? OR title LIKE ? OR responsible LIKE ? OR document_number LIKE ?"
search_pattern = f"%{search_term}%"
params = (search_pattern, search_pattern, search_pattern, search_pattern)
query += " ORDER BY id"
self.cursor.execute(query, params)
records = self.cursor.fetchall()
# 更新记录数量
self.cursor.execute(count_query, params)
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="#f8f9fa")
except Exception as e:
messagebox.showerror("数据库错误", f"加载数据失败: {str(e)}")
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, 700, 500)
dialog.resizable(False, False)
dialog.transient(self.root)
dialog.grab_set()
dialog.configure(bg="#f0f2f5")
# 标题栏
header = tk.Frame(dialog, bg="#4285f4", height=50)
header.pack(fill=tk.X)
header.pack_propagate(False)
tk.Label(header, text=f"添加{self.current_category}档案",
font=("Microsoft YaHei", 14, "bold"),
bg="#4285f4", fg="white").pack(pady=12)
# 内容区域
content_frame = tk.Frame(dialog, bg="#f0f2f5", padx=20, pady=15)
content_frame.pack(fill=tk.BOTH, expand=True)
# 滚动区域
canvas = tk.Canvas(content_frame, bg="#f0f2f5", bd=0, highlightthickness=0)
scrollbar = ttk.Scrollbar(content_frame, orient="vertical", command=canvas.yview)
scrollable_frame = tk.Frame(canvas, bg="#f0f2f5")
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:] # 排除序号
# 将字段分成两列
col_count = len(columns)
for i in range(0, col_count, 2):
row_frame = tk.Frame(scrollable_frame, bg="#f0f2f5", pady=8)
row_frame.pack(fill=tk.X)
# 第一个字段
col1 = columns[i]
frame1 = tk.Frame(row_frame, bg="#f0f2f5", padx=5)
frame1.pack(side=tk.LEFT, fill=tk.X, expand=True)
label_text1 = f"{col1}*" if col1 in ["档号", "题名"] else col1
label_color1 = "#ea4335" if col1 in ["档号", "题名"] else "#5f6368"
tk.Label(frame1, text=label_text1, width=8, font=("Microsoft YaHei", 10),
bg="#f0f2f5", fg=label_color1, anchor="w").pack(side=tk.TOP, fill=tk.X)
entry_style = "Required.TEntry" if col1 in ["档号", "题名"] else "TEntry"
entry1 = ttk.Entry(frame1, font=("Microsoft YaHei", 10), style=entry_style)
entry1.pack(side=tk.TOP, fill=tk.X, expand=True, ipady=3)
entries[col1] = entry1
# 第二个字段(如果有)
if i + 1 < col_count:
col2 = columns[i+1]
frame2 = tk.Frame(row_frame, bg="#f0f2f5", padx=5)
frame2.pack(side=tk.LEFT, fill=tk.X, expand=True)
label_text2 = f"{col2}*" if col2 in ["档号", "题名"] else col2
label_color2 = "#ea4335" if col2 in ["档号", "题名"] else "#5f6368"
tk.Label(frame2, text=label_text2, width=8, font=("Microsoft YaHei", 10),
bg="#f0f2f5", fg=label_color2, anchor="w").pack(side=tk.TOP, fill=tk.X)
entry_style2 = "Required.TEntry" if col2 in ["档号", "题名"] else "TEntry"
entry2 = ttk.Entry(frame2, font=("Microsoft YaHei", 10), style=entry_style2)
entry2.pack(side=tk.TOP, fill=tk.X, expand=True, ipady=3)
entries[col2] = entry2
# 按钮区域
btn_frame = tk.Frame(dialog, bg="#f0f2f5", 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="Primary.TButton").pack(side=tk.RIGHT, padx=10)
ttk.Button(btn_frame, text="取消", command=dialog.destroy,
style="Primary.TButton").pack(side=tk.RIGHT)
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, 700, 500)
dialog.resizable(False, False)
dialog.transient(self.root)
dialog.grab_set()
dialog.configure(bg="#f0f2f5")
# 标题栏
header = tk.Frame(dialog, bg="#4285f4", height=50)
header.pack(fill=tk.X)
header.pack_propagate(False)
tk.Label(header, text=f"修改{self.current_category}档案",
font=("Microsoft YaHei", 14, "bold"),
bg="#4285f4", fg="white").pack(pady=12)
# 内容区域
content_frame = tk.Frame(dialog, bg="#f0f2f5", padx=20, pady=15)
content_frame.pack(fill=tk.BOTH, expand=True)
# 滚动区域
canvas = tk.Canvas(content_frame, bg="#f0f2f5", bd=0, highlightthickness=0)
scrollbar = ttk.Scrollbar(content_frame, orient="vertical", command=canvas.yview)
scrollable_frame = tk.Frame(canvas, bg="#f0f2f5")
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:] # 排除序号
values = current_values[1:] # 排除序号
# 将字段分成两列
col_count = len(columns)
for i in range(0, col_count, 2):
row_frame = tk.Frame(scrollable_frame, bg="#f0f2f5", pady=8)
row_frame.pack(fill=tk.X)
# 第一个字段
col1 = columns[i]
frame1 = tk.Frame(row_frame, bg="#f0f2f5", padx=5)
frame1.pack(side=tk.LEFT, fill=tk.X, expand=True)
label_text1 = f"{col1}*" if col1 in ["档号", "题名"] else col1
label_color1 = "#ea4335" if col1 in ["档号", "题名"] else "#5f6368"
tk.Label(frame1, text=label_text1, width=8, font=("Microsoft YaHei", 10),
bg="#f0f2f5", fg=label_color1, anchor="w").pack(side=tk.TOP, fill=tk.X)
entry_style = "Required.TEntry" if col1 in ["档号", "题名"] else "TEntry"
entry1 = ttk.Entry(frame1, font=("Microsoft YaHei", 10), style=entry_style)
entry1.pack(side=tk.TOP, fill=tk.X, expand=True, ipady=3)
entries[col1] = entry1
# 填充现有值
if i < len(values):
entry1.insert(0, values[i])
# 第二个字段(如果有)
if i + 1 < col_count:
col2 = columns[i+1]
frame2 = tk.Frame(row_frame, bg="#f0f2f5", padx=5)
frame2.pack(side=tk.LEFT, fill=tk.X, expand=True)
label_text2 = f"{col2}*" if col2 in ["档号", "题名"] else col2
label_color2 = "#ea4335" if col2 in ["档号", "题名"] else "#5f6368"
tk.Label(frame2, text=label_text2, width=8, font=("Microsoft YaHei", 10),
bg="#f0f2f5", fg=label_color2, anchor="w").pack(side=tk.TOP, fill=tk.X)
entry_style2 = "Required.TEntry" if col2 in ["档号", "题名"] else "TEntry"
entry2 = ttk.Entry(frame2, font=("Microsoft YaHei", 10), style=entry_style2)
entry2.pack(side=tk.TOP, fill=tk.X, expand=True, ipady=3)
entries[col2] = entry2
# 填充现有值
if i + 1 < len(values):
entry2.insert(0, values[i+1])
# 按钮区域
btn_frame = tk.Frame(dialog, bg="#f0f2f5", 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="Primary.TButton").pack(side=tk.RIGHT, padx=10)
ttk.Button(btn_frame, text="取消", command=dialog.destroy,
style="Primary.TButton").pack(side=tk.RIGHT)
def save_record(self, entries, dialog, is_new=True, record_id=None):
"""保存记录(新增或修改)"""
try:
# 收集数据
data = {}
for col, entry in entries.items():
data[col] = entry.get().strip()
# 验证
if not data["档号"]:
messagebox.showerror("错误", "档号不能为空!")
return
if not data["题名"]:
messagebox.showerror("错误", "题名不能为空!")
return
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__":
try:
root = tk.Tk()
app = FileManagementSystem(root)
root.mainloop()
except Exception as e:
messagebox.showerror("系统错误", f"程序发生致命错误: {str(e)}")
traceback.print_exc()