编辑代码

import tkinter as tk
from tkinter import ttk, messagebox, filedialog
from tkcalendar import DateEntry
from datetime import datetime

class TravelApp:
    def __init__(self, root):
        self.root = root
        self.root.title("旅游票务管理系统")
        
        # 初始化数据存储
        self.selected_date = None
        self.projects = {"大索道": False, "小索道": False, "中索道": False}
        self.clients = []
        self.remarks = ""
        self.price_per = 0
        self.deposit_per = 0
        
        # 创建界面组件
        self.create_widgets()
        
    def create_widgets(self):
        # 日期选择模块
        ttk.Label(self.root, text="选择日期:").grid(row=0, column=0, padx=5, pady=5, sticky="w")
        self.date_entry = DateEntry(
            self.root,
            date_pattern="y.m.d",
            mindate=datetime.now(),
            locale="zh_CN"
        )
        self.date_entry.grid(row=0, column=1, padx=5, pady=5, sticky="ew")

        # 项目选择模块
        ttk.Label(self.root, text="选择项目:").grid(row=1, column=0, padx=5, pady=5, sticky="w")
        project_frame = ttk.Frame(self.root)
        project_frame.grid(row=1, column=1, sticky="w")
        
        self.project_vars = {}
        for i, (name, _) in enumerate(self.projects.items()):
            var = tk.BooleanVar()
            cb = ttk.Checkbutton(project_frame, text=name, variable=var)
            cb.grid(row=0, column=i, padx=5)
            self.project_vars[name] = var

        # 客户信息模块
        ttk.Button(self.root, text="添加客户信息", command=self.add_client).grid(
            row=2, column=0, padx=5, pady=5, sticky="w")
        self.client_listbox = tk.Listbox(self.root, width=50, height=4)
        self.client_listbox.grid(row=2, column=1, padx=5, pady=5, sticky="ew")

        # 价格信息模块
        ttk.Label(self.root, text="单价信息:").grid(row=3, column=0, padx=5, pady=5, sticky="w")
        price_frame = ttk.Frame(self.root)
        price_frame.grid(row=3, column=1, sticky="w")
        
        ttk.Label(price_frame, text="收客单价:").grid(row=0, column=0)
        self.price_entry = ttk.Entry(price_frame, width=8)
        self.price_entry.grid(row=0, column=1)
        
        ttk.Label(price_frame, text="定金单价:").grid(row=0, column=2, padx=(10,0))
        self.deposit_entry = ttk.Entry(price_frame, width=8)
        self.deposit_entry.grid(row=0, column=3)
        
        # 备注模块
        ttk.Label(self.root, text="备注信息:").grid(row=4, column=0, padx=5, pady=5, sticky="w")
        self.remark_entry = ttk.Entry(self.root, width=50)
        self.remark_entry.grid(row=4, column=1, padx=5, pady=5, sticky="ew")

        # 生成按钮
        ttk.Button(self.root, text="生成订单", command=self.generate_order).grid(
            row=5, column=1, padx=5, pady=10, sticky="e")

    def add_client(self):
        # 弹出添加客户窗口
        add_window = tk.Toplevel(self.root)
        add_window.title("添加客户信息")
        
        entries = {}
        fields = ["姓名", "身份证号", "手机号"]
        for i, field in enumerate(fields):
            ttk.Label(add_window, text=field+":").grid(row=i, column=0, padx=5, pady=2)
            entries[field] = ttk.Entry(add_window)
            entries[field].grid(row=i, column=1, padx=5, pady=2)
        
        def save_client():
            client = {
                "name": entries["姓名"].get(),
                "id": entries["身份证号"].get(),
                "phone": entries["手机号"].get()
            }
            if all(client.values()):
                self.clients.append(client)
                self.client_listbox.insert(tk.END, f"{client['name']} {client['id']}")
                add_window.destroy()
            else:
                messagebox.showwarning("提示", "请填写完整信息!")
        
        ttk.Button(add_window, text="保存", command=save_client).grid(
            row=len(fields), columnspan=2, pady=5)

    def generate_order(self):
        try:
            # 获取所有数据
            selected_date = self.date_entry.get_date().strftime("%Y.%-m.%-d")
            selected_projects = [name for name, var in self.project_vars.items() if var.get()]
            project_str = "+".join(selected_projects) + "系统票"
            
            # 构建客户信息
            client_info = []
            for client in self.clients:
                client_info.append(f"{client['name']}\n{client['id']}\n{client['phone']}")
            
            # 计算价格
            price = int(self.price_entry.get())
            deposit = int(self.deposit_entry.get())
            total_people = len(self.clients)
            
            price_str = f"{price}×{total_people}={price*total_people}"
            deposit_str = f"定金:{deposit}×{total_people}={deposit*total_people}"
            balance_str = f"尾款:{(price-deposit)*total_people}(游玩当天付)"
            
            # 组合最终文本
            final_text = (
                f"{selected_date}{project_str}\n\n" +
                "\n\n".join(client_info) + "\n\n" +
                f"备注:{self.remark_entry.get()}\n" +
                f"{price_str}\n" +
                f"{deposit_str}\n" +
                balance_str
            )
            
            # 保存文件
            file_path = filedialog.asksaveasfilename(
                defaultextension=".txt",
                filetypes=[("Text files", "*.txt")]
            )
            if file_path:
                with open(file_path, "w", encoding="utf-8") as f:
                    f.write(final_text)
                messagebox.showinfo("成功", "文件已保存!")
        
        except ValueError:
            messagebox.showerror("错误", "请输入有效的数字价格!")
        except Exception as e:
            messagebox.showerror("错误", f"发生错误:{str(e)}")

if __name__ == "__main__":
    root = tk.Tk()
    app = TravelApp(root)
    root.mainloop()