gui.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  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. "成都锦高量科科技有限公司", "成都云启寰宇科技有限公司", "成都橙风有量科技有限公司", "绵阳新手游圈科技有限公司",
  25. "成都云端助手科技有限公司","江苏有量科技有限公司","深圳市星域互娱科技有限公司","深圳云端助手科技有限公司"
  26. ]
  27. company_combo.pack(side=tk.LEFT, padx=5)
  28. frame_bank = ttk.Frame(self.root, padding="10")
  29. frame_bank.pack(fill=tk.X)
  30. ttk.Label(frame_bank, text="开户银行:").pack(side=tk.LEFT)
  31. bank_combo = ttk.Combobox(frame_bank, textvariable=self.bank_var, state="readonly")
  32. bank_combo["values"] = ["建设银行", "中国银行", "农业银行", "微众银行", "农信银行"]
  33. bank_combo.pack(side=tk.LEFT, padx=5)
  34. frame_param = ttk.Frame(self.root, padding="10")
  35. frame_param.pack(fill=tk.X)
  36. ttk.Label(frame_param, text="参数表文件:").pack(side=tk.LEFT)
  37. ttk.Entry(frame_param, textvariable=self.param_file_var, width=50).pack(side=tk.LEFT, padx=5)
  38. ttk.Button(frame_param, text="选择", command=self.select_param_file).pack(side=tk.LEFT)
  39. frame_flow = ttk.Frame(self.root, padding="10")
  40. frame_flow.pack(fill=tk.X)
  41. ttk.Label(frame_flow, text="流水文件:").pack(side=tk.LEFT)
  42. ttk.Entry(frame_flow, textvariable=self.flow_file_var, width=50).pack(side=tk.LEFT, padx=5)
  43. ttk.Button(frame_flow, text="选择", command=self.select_flow_file).pack(side=tk.LEFT)
  44. frame_generate = ttk.Frame(self.root, padding="10")
  45. frame_generate.pack(fill=tk.X)
  46. ttk.Button(frame_generate, text="生成日记账", command=self.generate_journal, style="Accent.TButton").pack()
  47. def select_param_file(self):
  48. """选择参数表文件"""
  49. file_path = filedialog.askopenfilename(
  50. title="选择参数表文件",
  51. filetypes=[("Excel文件", "*.xlsx *.xls"), ("所有文件", "*.*")]
  52. )
  53. if file_path:
  54. self.param_file_var.set(file_path)
  55. def select_flow_file(self):
  56. """选择银行流水文件"""
  57. bank = self.bank_var.get()
  58. file_path = filedialog.askopenfilename(
  59. title=f"选择{bank}流水文件",
  60. filetypes=[("Excel文件", "*.xlsx *.xls"), ("所有文件", "*.*")]
  61. )
  62. if file_path:
  63. self.flow_file_var.set(file_path)
  64. def generate_journal(self):
  65. """生成日记账"""
  66. company = self.company_var.get()
  67. bank = self.bank_var.get()
  68. param_file = self.param_file_var.get()
  69. flow_file = self.flow_file_var.get()
  70. if not param_file or not flow_file:
  71. messagebox.showwarning("提示", "请先选择参数表和流水文件")
  72. return
  73. parser = self.parser_factory.get_parser(bank)
  74. if parser is None:
  75. messagebox.showerror("错误", f"不支持的银行:{bank}")
  76. return
  77. flow_df = parser.parse(flow_file)
  78. if flow_df is None:
  79. return
  80. journal_df = self.journal_generator.generate_journal_data(company, bank, param_file, flow_df)
  81. if journal_df is None:
  82. return
  83. today = datetime.now().strftime("%Y年%m月%d日")
  84. save_path = filedialog.asksaveasfilename(
  85. title="保存日记账",
  86. defaultextension=".xlsx",
  87. initialfile=f"{company}-{bank}-日记账-{today}.xlsx",
  88. filetypes=[("Excel文件", "*.xlsx"), ("所有文件", "*.*")]
  89. )
  90. if save_path:
  91. if self.journal_generator.save_journal(journal_df, save_path):
  92. messagebox.showinfo("成功", f"日记账已生成:{save_path}")