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()