gui.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. import tkinter as tk
  2. from tkinter import ttk, filedialog, messagebox
  3. from datetime import datetime
  4. class JournalGeneratorGUI:
  5. """日记账生成器GUI界面"""
  6. def __init__(self, root, journal_generator, parser_factory):
  7. self.root = root
  8. self.journal_generator = journal_generator
  9. self.parser_factory = parser_factory
  10. self.company_var = tk.StringVar(value="成都锦高量科科技有限公司")
  11. self.bank_var = tk.StringVar(value="建设银行")
  12. self.param_file_var = tk.StringVar()
  13. self.flow_file_var = tk.StringVar()
  14. self.setup_ui()
  15. def setup_ui(self):
  16. """设置界面"""
  17. self.root.title("出纳日记账生成工具")
  18. self.root.geometry("600x300")
  19. frame_company = ttk.Frame(self.root, padding="10")
  20. frame_company.pack(fill=tk.X)
  21. ttk.Label(frame_company, text="公司名称:").pack(side=tk.LEFT)
  22. company_combo = ttk.Combobox(frame_company, textvariable=self.company_var, state="readonly")
  23. company_combo["values"] = ["成都锦高量科科技有限公司", "成都云启寰宇科技有限公司", "成都橙风有量科技有限公司"]
  24. company_combo.pack(side=tk.LEFT, padx=5)
  25. frame_bank = ttk.Frame(self.root, padding="10")
  26. frame_bank.pack(fill=tk.X)
  27. ttk.Label(frame_bank, text="开户银行:").pack(side=tk.LEFT)
  28. bank_combo = ttk.Combobox(frame_bank, textvariable=self.bank_var, state="readonly")
  29. bank_combo["values"] = ["建设银行", "中国银行", "农业银行"]
  30. bank_combo.pack(side=tk.LEFT, padx=5)
  31. frame_param = ttk.Frame(self.root, padding="10")
  32. frame_param.pack(fill=tk.X)
  33. ttk.Label(frame_param, text="参数表文件:").pack(side=tk.LEFT)
  34. ttk.Entry(frame_param, textvariable=self.param_file_var, width=50).pack(side=tk.LEFT, padx=5)
  35. ttk.Button(frame_param, text="选择", command=self.select_param_file).pack(side=tk.LEFT)
  36. frame_flow = ttk.Frame(self.root, padding="10")
  37. frame_flow.pack(fill=tk.X)
  38. ttk.Label(frame_flow, text="流水文件:").pack(side=tk.LEFT)
  39. ttk.Entry(frame_flow, textvariable=self.flow_file_var, width=50).pack(side=tk.LEFT, padx=5)
  40. ttk.Button(frame_flow, text="选择", command=self.select_flow_file).pack(side=tk.LEFT)
  41. frame_generate = ttk.Frame(self.root, padding="10")
  42. frame_generate.pack(fill=tk.X)
  43. ttk.Button(frame_generate, text="生成日记账", command=self.generate_journal, style="Accent.TButton").pack()
  44. def select_param_file(self):
  45. """选择参数表文件"""
  46. file_path = filedialog.askopenfilename(
  47. title="选择参数表文件",
  48. filetypes=[("Excel文件", "*.xlsx *.xls"), ("所有文件", "*.*")]
  49. )
  50. if file_path:
  51. self.param_file_var.set(file_path)
  52. def select_flow_file(self):
  53. """选择银行流水文件"""
  54. bank = self.bank_var.get()
  55. file_path = filedialog.askopenfilename(
  56. title=f"选择{bank}流水文件",
  57. filetypes=[("Excel文件", "*.xlsx *.xls"), ("所有文件", "*.*")]
  58. )
  59. if file_path:
  60. self.flow_file_var.set(file_path)
  61. def generate_journal(self):
  62. """生成日记账"""
  63. company = self.company_var.get()
  64. bank = self.bank_var.get()
  65. param_file = self.param_file_var.get()
  66. flow_file = self.flow_file_var.get()
  67. if not param_file or not flow_file:
  68. messagebox.showwarning("提示", "请先选择参数表和流水文件")
  69. return
  70. parser = self.parser_factory.get_parser(bank)
  71. if parser is None:
  72. messagebox.showerror("错误", f"不支持的银行:{bank}")
  73. return
  74. flow_df = parser.parse(flow_file)
  75. if flow_df is None:
  76. return
  77. journal_df = self.journal_generator.generate_journal_data(company, bank, param_file, flow_df)
  78. if journal_df is None:
  79. return
  80. today = datetime.now().strftime("%Y年%m月%d日")
  81. save_path = filedialog.asksaveasfilename(
  82. title="保存日记账",
  83. defaultextension=".xlsx",
  84. initialfile=f"{company}-{bank}-日记账-{today}.xlsx",
  85. filetypes=[("Excel文件", "*.xlsx"), ("所有文件", "*.*")]
  86. )
  87. if save_path:
  88. if self.journal_generator.save_journal(journal_df, save_path):
  89. messagebox.showinfo("成功", f"日记账已生成:{save_path}")