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