555555

dfgdfgdfgc 
根据以下代码,进行页面优化,要求能在不联网的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()
07-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值