import tkinter as tk from tkinter import ttk, filedialog, messagebox from datetime import datetime class JournalGeneratorGUI: """日记账生成器GUI界面""" def __init__(self, root, journal_generator, parser_factory): self.root = root self.journal_generator = journal_generator self.parser_factory = parser_factory self.company_var = tk.StringVar(value="成都锦高量科科技有限公司") self.bank_var = tk.StringVar(value="建设银行") self.param_file_var = tk.StringVar() self.flow_file_var = tk.StringVar() self.setup_ui() def setup_ui(self): """设置界面""" self.root.title("出纳日记账生成工具") self.root.geometry("600x300") frame_company = ttk.Frame(self.root, padding="10") frame_company.pack(fill=tk.X) ttk.Label(frame_company, text="公司名称:").pack(side=tk.LEFT) company_combo = ttk.Combobox(frame_company, textvariable=self.company_var, state="readonly") company_combo["values"] = ["成都锦高量科科技有限公司", "成都云启寰宇科技有限公司", "成都橙风有量科技有限公司"] company_combo.pack(side=tk.LEFT, padx=5) frame_bank = ttk.Frame(self.root, padding="10") frame_bank.pack(fill=tk.X) ttk.Label(frame_bank, text="开户银行:").pack(side=tk.LEFT) bank_combo = ttk.Combobox(frame_bank, textvariable=self.bank_var, state="readonly") bank_combo["values"] = ["建设银行", "中国银行", "农业银行"] bank_combo.pack(side=tk.LEFT, padx=5) frame_param = ttk.Frame(self.root, padding="10") frame_param.pack(fill=tk.X) ttk.Label(frame_param, text="参数表文件:").pack(side=tk.LEFT) ttk.Entry(frame_param, textvariable=self.param_file_var, width=50).pack(side=tk.LEFT, padx=5) ttk.Button(frame_param, text="选择", command=self.select_param_file).pack(side=tk.LEFT) frame_flow = ttk.Frame(self.root, padding="10") frame_flow.pack(fill=tk.X) ttk.Label(frame_flow, text="流水文件:").pack(side=tk.LEFT) ttk.Entry(frame_flow, textvariable=self.flow_file_var, width=50).pack(side=tk.LEFT, padx=5) ttk.Button(frame_flow, text="选择", command=self.select_flow_file).pack(side=tk.LEFT) frame_generate = ttk.Frame(self.root, padding="10") frame_generate.pack(fill=tk.X) ttk.Button(frame_generate, text="生成日记账", command=self.generate_journal, style="Accent.TButton").pack() def select_param_file(self): """选择参数表文件""" file_path = filedialog.askopenfilename( title="选择参数表文件", filetypes=[("Excel文件", "*.xlsx *.xls"), ("所有文件", "*.*")] ) if file_path: self.param_file_var.set(file_path) def select_flow_file(self): """选择银行流水文件""" bank = self.bank_var.get() file_path = filedialog.askopenfilename( title=f"选择{bank}流水文件", filetypes=[("Excel文件", "*.xlsx *.xls"), ("所有文件", "*.*")] ) if file_path: self.flow_file_var.set(file_path) def generate_journal(self): """生成日记账""" company = self.company_var.get() bank = self.bank_var.get() param_file = self.param_file_var.get() flow_file = self.flow_file_var.get() if not param_file or not flow_file: messagebox.showwarning("提示", "请先选择参数表和流水文件") return parser = self.parser_factory.get_parser(bank) if parser is None: messagebox.showerror("错误", f"不支持的银行:{bank}") return flow_df = parser.parse(flow_file) if flow_df is None: return journal_df = self.journal_generator.generate_journal_data(company, bank, param_file, flow_df) if journal_df is None: return today = datetime.now().strftime("%Y年%m月%d日") save_path = filedialog.asksaveasfilename( title="保存日记账", defaultextension=".xlsx", initialfile=f"{company}-{bank}-日记账-{today}.xlsx", filetypes=[("Excel文件", "*.xlsx"), ("所有文件", "*.*")] ) if save_path: if self.journal_generator.save_journal(journal_df, save_path): messagebox.showinfo("成功", f"日记账已生成:{save_path}")