import tkinter as tk from tkinter import ttk import tkinter.messagebox import demo import pymysql from config import mysql_local # 定义一个删除函数,用于清空显示火车票信息的表格 def del_select(): for item in tree_view.get_children(''): tree_view.delete(item) # 定义一个查询火车票信息的函数 def GetTicket(): start_city = from_station.get() end_city = to_station.get() date = from_date.get() if len(start_city) >= 1 and len(end_city) >= 1 and len(date) >= 1: tickets = demo.Ticket(start_city=start_city, end_city=end_city, date=date) del_select() for index, ticket in enumerate(tickets): tree_view.insert('', index + 1, values=( ticket['SerialNo'], ticket['TravelNumber'], ticket['DepartureTime'], ticket['ArrivalTime'], ticket['TimeTime'], ticket['PremiumSeat'], ticket['FirstClassSeat'], ticket['SecondClassSeat'], ticket['SoftSleeper'], ticket['HardSleeper'], ticket['HardSeat'], ticket['Noseat'], )) else: tkinter.messagebox.showerror(title='警告', message='输入有误') # 创建 Tkinter 应用主窗口 root = tk.Tk() root.title('火车票查票小软件') root.iconbitmap("img\\search.ico") root.geometry('1040x620+500+500') img = tk.PhotoImage(file='img\\封面png.png') tk.Label(root, image=img).pack() # 创建一个标签框架 Top_frame = tk.LabelFrame(root) Top_frame.pack(pady=10) left_frame = tk.Frame(Top_frame) left_frame.pack(side=tk.LEFT) v = tk.IntVar() v.set(1) tk.Radiobutton(left_frame, text='单程', font=('微软雅黑', 12), variable=v, value=1).pack() tk.Radiobutton(left_frame, text='往返', font=('微软雅黑', 12), variable=v, value=2).pack() mid_frame = tk.Frame(Top_frame) mid_frame.pack(side=tk.LEFT, padx=10) from_station = tk.StringVar() tk.Label(mid_frame, text='出发地', font=('微软雅黑', 12)).pack(padx=10, side=tk.LEFT) tk.Entry(mid_frame, width=10, textvariable=from_station).pack(side=tk.LEFT) tk.Label(mid_frame, text='↔', font=('微软雅黑', 12), fg='#0096c7').pack(padx=20, side=tk.LEFT) to_station = tk.StringVar() tk.Label(mid_frame, text='目的地', font=('微软雅黑', 12)).pack(side=tk.LEFT) tk.Entry(mid_frame, width=10, textvariable=to_station).pack(padx=10, side=tk.LEFT) from_date = tk.StringVar() from_date.set('2024-06-01') tk.Label(mid_frame, text='出发日', font=('微软雅黑', 12)).pack(padx=20, side=tk.LEFT) tk.Entry(mid_frame, width=10, textvariable=from_date).pack(side=tk.LEFT) to_date = tk.StringVar() tk.Label(mid_frame, text='车次序号', font=('微软雅黑', 12)).pack(padx=20, side=tk.LEFT) tk.Entry(mid_frame, width=10, textvariable=to_date).pack(side=tk.LEFT) right_frame = tk.Frame(Top_frame) right_frame.pack(side=tk.LEFT, padx=10) v_1 = tk.IntVar() v_1.set(1) tk.Radiobutton(right_frame, text='普通', font=('微软雅黑', 12), variable=v_1, value=1).pack(padx=10) tk.Radiobutton(right_frame, text='学生', font=('微软雅黑', 12), variable=v_1, value=2).pack(padx=10) # 按钮部分 Button_frame = tk.Frame(Top_frame) Button_frame.pack(side=tk.LEFT, padx=10) tk.Button(Button_frame, text='查询', font=('微软雅黑', 12), width=10, bg='#f79209', fg='white', relief='flat', command=GetTicket).pack(pady=5) # 创建 buy_ticket_frame buy_ticket_frame = tk.Frame(Top_frame) buy_ticket_frame.pack(pady=10) tk.Label(buy_ticket_frame, text='购票人姓名', font=('微软雅黑', 12)).pack(padx=10, side=tk.LEFT) passenger_name = tk.StringVar() tk.Entry(buy_ticket_frame, width=10, textvariable=passenger_name).pack(side=tk.LEFT) tk.Label(buy_ticket_frame, text='身份证号', font=('微软雅黑', 12)).pack(padx=20, side=tk.LEFT) id_number = tk.StringVar() tk.Entry(buy_ticket_frame, width=18, textvariable=id_number).pack(side=tk.LEFT) # 数据库操作相关代码 class tickets: def __init__(self): self.conn = pymysql.connect(**mysql_local) self.cursor = self.conn.cursor() def save(self, SerialNo, TravelNumber, DepartureTime, ArrivalTime, TimeTime, PremiumSeat, FirstClassSeat, SecondClassSeat, SoftSleeper, HardSleeper, HardSeat, Noseat): data = (SerialNo, TravelNumber, DepartureTime, ArrivalTime, TimeTime, PremiumSeat, FirstClassSeat, SecondClassSeat, SoftSleeper, HardSleeper, HardSeat, Noseat) sql = "INSERT INTO tickets (SerialNo, TravelNumber, DepartureTime, ArrivalTime, TimeTime, PremiumSeat, FirstClassSeat, SecondClassSeat, SoftSleeper, HardSleeper, HardSeat, Noseat) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)" self.cursor.execute(sql, data) self.conn.commit() # 在 BuyTicket 函数中添加数据库操作 c = tickets() def BuyTicket(): start_city = from_station.get() end_city = to_station.get() date = from_date.get() ticket_number = to_date.get() # 获取输入的车次序号 # c = tickets() # 实例化一个 tickets 类 # ... 省略获取购票人姓名和身份证号等信息的部分 ... if len(start_city) >= 1 and len(end_city) >= 1 and len(date) >= 1 and len(ticket_number) >= 1: # 使用获取的车次序号查询对应的车次信息 # 这里假设 demo 模块中的 Ticket 函数可以根据提供的车次序号返回对应的车次信息 selected_ticket = demo.Ticket(start_city, end_city, date) # 假设 demo 模块中有这样的函数 # 将车次信息存入数据库 if selected_ticket: for ticket in selected_ticket: # 假设返回多个车次信息 if ticket['TravelNumber'] == ticket_number: # 找到与输入的车次序号相匹配的车次信息 c.save(ticket['SerialNo'], ticket['TravelNumber'], ticket['DepartureTime'], ticket['ArrivalTime'], ticket['TimeTime'], ticket['PremiumSeat'], ticket['FirstClassSeat'], ticket['SecondClassSeat'], ticket['SoftSleeper'], ticket['HardSleeper'], ticket['HardSeat'], ticket['Noseat']) tkinter.messagebox.showinfo(title='购票结果', message='购买成功!车次信息已保存到数据库。') return tkinter.messagebox.showerror(title='购票失败', message='未找到对应车次序号的车次信息。') else: tkinter.messagebox.showerror(title='购票失败', message='未找到对应的车次信息。') else: tkinter.messagebox.showerror(title='输入有误', message='请输入有效的出发地、目的地、日期和车次序号。') tk.Button(Button_frame, text='购票', font=('微软雅黑', 12), width=10, bg='#f79209', fg='white', relief='flat', command=BuyTicket).pack(pady=5) columns = ("SerialNo", "TravelNumber", "DepartureTime", "ArrivalTime", "TimeTime", "PremiumSeat", "FirstClassSeat", "SecondClassSeat", 'SoftSleeper', "HardSleeper", "HardSeat", "Noseat") columns_value = ("序号", "车次", "出发时间", "到达时间", "耗时", "特等座", "一等座", "二等座", '软卧', "硬卧", "硬座", "无座") tree_view = ttk.Treeview(root, height=18, show="headings", columns=columns) # 设置列名 for col, val in zip(columns, columns_value): tree_view.column(col, width=80, anchor='center') tree_view.heading(col, text=val) tree_view.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) # 创建滚动窗口并布局到页面上 sb = tk.Scrollbar(root) sb.pack(side=tk.RIGHT, fill=tk.Y) sb.config(command=tree_view.yview) def close_database(conn): cursor = conn.cursor() sql = "DELETE FROM chepiao_info" cursor.execute(sql) conn.commit() conn.close() # 关闭数据库连接 # 在程序结束前关闭数据库连接并清空数据 root.mainloop() close_database(c.conn) # 假设 c 是 tickets 类的实例