You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

181 lines
7.8 KiB

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 类的实例