iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >使用Python实现火车票查询系统(带界面)
  • 270
分享到

使用Python实现火车票查询系统(带界面)

2024-04-02 19:04:59 270人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录导语一、运行环境二、代码展示三、效果展示导语 周末、假期来了,七夕也快到了,又到一年中最一票难求的时候了! 那些假期想回家、过节异地恋的小可爱们,能准时抢到回家(约会对象)的城市

导语

周末、假期来了,七夕也快到了,又到一年中最一票难求的时候了!

那些假期想回家、过节异地恋的小可爱们,能准时抢到回家(约会对象)的城市票嘛?

为了让大家尽早的和亲朋好友家人团聚,小编今年很英勇的出来提醒大家早点儿抢火车票啦!

(时不我待,有票的时候妖提前买好啦~不然到时候在卖科能没票了滴)

特地为大家写了一款代码基于python的有界面火车票查询系统,随时随地查询,不然去专门购票的地方问,没票白跑一趟也麻烦了——如果有票记得早点儿买买买哈!

注:需要不需要都要学一下,万一哪天就用上了呢,学到了也不亏哈!

一、运行环境

1)小编使用的环境:python3PyCharm社区版、requests、PyQt5模块、部分自带就不一一展示啦。

模块安装:pip install -i https://pypi.douban.com/simple/+模块名 

二、代码展示

1)爬取数据

import re
import urllib
from urllib import request
# from pprint import pprint
url = 'Https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9048'
req = urllib.request.Request(url)
r = urllib.request.urlopen(req).read().decode('utf-8')
stations =re.findall(r'([\u4e00-\u9fa5]+)\|([A-Z]+)',r)    # 匹配中文和对应的英文
stations = dict(stations)     # 转化成字典
# pprint(stations)      # 以列的形式打印出来

2)主程序

'''
火车票查询系统
'''
__author__ = 'Scorpio'
import sys
from PyQt5.QtCore import Qt,QDateTime
from PyQt5.QtWidgets import QWidget,QMessageBox,QApplication,QLabel,QTableWidget,QLineEdit,QHBoxLayout,QGridLayout,QVBoxLayout,QPushButton,QTableWidgetItem,QFrame,QDateTimeEdit
from PyQt5.QtGui import QFont,QColor,QBrush
from get_stations import stations
import warnings
import requests
class TableSheet(QWidget):
    def __init__(self):
        super().__init__()
        self.initUi()

    def initUi(self):
        #self.setWindowFlags(Qt.WindowCloseButtonHint && Qt.WindowMinimizeButtonHint)
        #self.setWindowFlags(Qt.WindowMinimizeButtonHint)
        self.setWindowTitle('火车票查询系统')
        #self.setGeometry(40,80,1500,720)
        #第一部分,输入出发地、目的地和日期
        controlsLayout = QGridLayout()      #栅格布局
        self.label1 = QLabel("出发地:")
        self.Editlabel1 = QLineEdit()
        self.label2 = QLabel("目的地:")
        self.Editlabel2 = QLineEdit()
        self.label3 = QLabel("乘车日期:")

        self.Editlabel3 = QDateTimeEdit()
        now = QDateTime.currentDateTime()
        #print(now)
        self.Editlabel3.setDateTime(now)
        self.Editlabel3.setDisplayFORMat("yyyy-MM-dd")      #小写m为分钟
        self.Editlabel3.setCalendarPopup(True)

        self.buttonOK = QPushButton("确定")

        controlsLayout.addWidget(QLabel(""),0,0,1,6)
        self.message = QLabel("暂未查询车次信息!")
        controlsLayout.addWidget(self.message,0,7,1,4)
        
        controlsLayout.addWidget(self.label1,0,11,1,1)
        controlsLayout.addWidget(self.Editlabel1,0,12,1,2)
        controlsLayout.addWidget(QLabel(" "),0,14,1,1)
        
        controlsLayout.addWidget(self.label2,0,15,1,1)
        controlsLayout.addWidget(self.Editlabel2,0,16,1,2)
        controlsLayout.addWidget(QLabel(" "),0,18,1,1)

        controlsLayout.addWidget(self.label3,0,19,1,1)
        controlsLayout.addWidget(self.Editlabel3,0,20,1,2)
        controlsLayout.addWidget(QLabel(" "),0,22,1,1)
        
        controlsLayout.addWidget(self.buttonOK,0,23,1,1)
        controlsLayout.addWidget(QLabel(" "),0,25,1,8)

        #第二部分,显示查询到的车次信息
        horizontalHeader = ["车次","车站","时间","历时","商务座","一等座","二等座","高级软卧","软卧","动卧","硬卧","软座","硬座","无座","其他"]
        self.table = QTableWidget()
        self.table.setColumnCount(15)
        self.table.setRowCount(0)       #初始化为0行
        self.table.setHorizontalHeaderLabels(horizontalHeader)
        self.table.setEditTriggers(QTableWidget.NoEditTriggers)     #不能编辑
        self.table.setSelectionBehavior(QTableWidget.SelectRows)    #选中整行
        self.table.setSelectionMode(QTableWidget.SingleSelection)
        for index in range(self.table.columnCount()):
            headItem = self.table.horizontalHeaderItem(index)
            headItem.setFont(QFont("song", 12, QFont.Bold))
            headItem.setForeground(QBrush(Qt.gray))
            headItem.setTextAlignment(Qt.AlignCenter | Qt.AlignVCenter)
        #self.table.setFrameShape(QFrame.HLine)#设定样式
        #self.table.setShowGrid(False) #取消网格线
        #self.table.verticalHeader().setVisible(False) #隐藏垂直表头
        #row_count = self.table.rowCount()
        #self.table.setColumnWidth(0,200)
        mainLayout = QHBoxLayout()
        mainLayout.addWidget(self.table)
        layout = QVBoxLayout()
        layout.addLayout(controlsLayout)
        layout.addLayout(mainLayout)
        self.setLayout(layout)
        self.buttonOK.clicked.connect(self.showMessage)
        self.showMaximized()

    def closeEvent(self, event):        #关闭时弹窗提示
        reply = QMessageBox.question(self, '警告', '查询记录不会被保存,\n确认退出?',QMessageBox.Yes,QMessageBox.No)
        if reply == QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()

    def showMessage(self):      #显示查询信息
        stations_fz = dict(map(lambda t:(t[1],t[0]), stations.items()))     #反转字典
        from_s = self.Editlabel1.text()   #获取文本框内容
        to_s = self.Editlabel2.text()
        if (from_s in stations.keys()) and (to_s in stations.keys()):
            f = stations[from_s]     # 通过字典转化为车站对应的缩写字母
            t = stations[to_s]       # 通过字典转化为车站对应的缩写字母
            date = self.Editlabel3.text()
            d = str(date)
            # print(d)
            # print('正在查询' + from_s + '至' + to_s + '的列车...')
            url = 'https://kyfw.12306.cn/otn/leftTicket/queryO?leftTicketDTO.train_date=' + d + '&leftTicketDTO.from_station=' + f + '&leftTicketDTO.to_station=' + t +'&purpose_codes=ADULT'
            # print(url)
            warnings.filterwarnings("ignore")  # 这个网站是有安全警告的,这段代码可以忽略警告
            r = requests.get(url, verify=False)
            raw_trains = r.JSON()['data']['result']     # 获取车次信息
            # print(raw_trains)
            num = len(raw_trains)       # 获取车次数目
            # print('共查询到%d个车次信息'%num)
            self.message.setText("共查询到%d个车次信息"%num)
            if raw_trains == []:
                QMessageBox.warning(self, "提示", "暂无所查询的车次信息!")
            i=0
            self.table.setRowCount(num)
            self.table.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)      #关闭水平滚动条
            for raw_train in raw_trains:
                # split分割之后得到的是一个列表
                data_list = raw_train.split("|")
                # print(data_list)
                tra_no = data_list[2]     #train_no
                from_s_no = data_list[16]   #from_station_no
                to_s_no = data_list[17]     #to_station_no
                seat_type = data_list[35]       #seat_types
                tra_date = d            #train_date
                checi = data_list[3]     # 车次
                cfd = stations_fz[data_list[6]]      #出发地,通过字典转换
                mdd = stations_fz[data_list[7]]      #目的地
                fctime = data_list[8]    # 发车时间
                ddtime = data_list[9]    # 到达时间
                lishi = data_list[10]    # 历时
                shangwuzuo = data_list[32] or "--"    # 商务座/特等座
                yidengzuo = data_list[31] or "--"     # 一等座
                erdengzuo = data_list[30] or "--"     # 二等座
                gjruanwo = data_list[21] or "--"      # 高级软卧
                ruanwo = data_list[23] or "--"        # 软卧
                dongwo = data_list[33] or "--"        # 动卧
                yingwo = data_list[28] or "--"        # 硬卧
                ruanzuo = data_list[24] or "--"       # 软座
                yingzuo = data_list[29] or "--"       # 硬座
                wuzuo = data_list[26] or "--"         # 无座
                others = data_list[22] or "--"        # 其他

                price_url = "https://kyfw.12306.cn/otn/leftTicket/queryTicketPrice?train_no="+tra_no+"&from_station_no="+from_s_no+"&to_station_no="+to_s_no+"&seat_types="+seat_type+"&train_date="+tra_date
                r1 = requests.get(price_url, verify=False)
                # print(price_url)
                raw_prices = r1.json()['data']  # 获取车次信息
                if 'A1' in raw_prices.keys():           #A1:硬座
                    pr_yz = raw_prices['A1']
                else:
                    pr_yz = ''
                if 'A2' in raw_prices.keys():           # A2:软座
                    pr_rz = raw_prices['A2']
                else:
                    pr_rz = ''
                if 'A3' in raw_prices.keys():           # A3:硬卧
                    pr_yw = raw_prices['A3']
                else:
                    pr_yw = ''
                if 'A4' in raw_prices.keys():           # A4:软卧
                    pr_rw = raw_prices['A4']
                else:
                    pr_rw = ''
                if 'A6' in raw_prices.keys():           # A6:高级软卧
                    pr_gjrw = raw_prices['A6']
                else:
                    pr_gjrw = ''
                if 'A9' in raw_prices.keys():           # A9:商务座,特等座
                    pr_swz = raw_prices['A9']
                else:
                    pr_swz = ''
                if 'WZ' in raw_prices.keys():           # WZ:无座
                    pr_wz = raw_prices['WZ']
                else:
                    pr_wz = ''
                if 'M' in raw_prices.keys():            # M:一等座
                    pr_ydz = raw_prices['M']
                else:
                    pr_ydz = ''
                if 'O' in raw_prices.keys():            # O:二等座
                    pr_edz = raw_prices['O']
                else:
                    pr_edz = ''
                if 'F' in raw_prices.keys():            # F:动卧
                    pr_dw = raw_prices['F']
                else:
                    pr_dw = ''
                # print(pr_yz,pr_rz,pr_yw,pr_rw,pr_gjrw,pr_swz,pr_wz,pr_ydz,pr_edz,pr_dw)
                NewItem=QTableWidgetItem(checi)
                NewItem.setForeground(QColor(Qt.red))
                NewItem.setTextAlignment(Qt.AlignCenter | Qt.AlignVCenter)  #垂直居中
                self.table.setItem(i,0,NewItem)

                NewItem=QTableWidgetItem(cfd +'\n-\n'+mdd)
                NewItem.setFont(QFont("song", 9, QFont.Bold))
                NewItem.setTextAlignment(Qt.AlignCenter | Qt.AlignVCenter)
                self.table.setItem(i,1,NewItem)

                NewItem=QTableWidgetItem(fctime+'\n-\n'+ddtime)
                NewItem.setFont(QFont("song", 9, QFont.Bold))
                NewItem.setTextAlignment(Qt.AlignCenter | Qt.AlignVCenter)
                self.table.setItem(i,2,NewItem)

                NewItem=QTableWidgetItem(lishi)
                NewItem.setFont(QFont("song", 9, QFont.Bold))
                NewItem.setTextAlignment(Qt.AlignCenter | Qt.AlignVCenter)
                self.table.setItem(i,3,NewItem)

                NewItem=QTableWidgetItem(shangwuzuo+'\n'+ pr_swz)
                NewItem.setTextAlignment(Qt.AlignCenter | Qt.AlignVCenter)
                self.table.setItem(i,4,NewItem)

                NewItem=QTableWidgetItem(yidengzuo+'\n'+ pr_ydz)
                NewItem.setTextAlignment(Qt.AlignCenter | Qt.AlignVCenter)
                self.table.setItem(i,5,NewItem)

                NewItem=QTableWidgetItem(erdengzuo+'\n'+ pr_edz)
                NewItem.setTextAlignment(Qt.AlignCenter | Qt.AlignVCenter)
                self.table.setItem(i,6,NewItem)

                NewItem=QTableWidgetItem(gjruanwo+'\n'+ pr_gjrw)
                NewItem.setTextAlignment(Qt.AlignCenter | Qt.AlignVCenter)
                self.table.setItem(i,7,NewItem)

                NewItem=QTableWidgetItem(ruanwo+'\n'+ pr_rw)
                NewItem.setTextAlignment(Qt.AlignCenter | Qt.AlignVCenter)
                self.table.setItem(i,8,NewItem)

                NewItem=QTableWidgetItem(dongwo+'\n'+ pr_dw)
                NewItem.setTextAlignment(Qt.AlignCenter | Qt.AlignVCenter)
                self.table.setItem(i,9,NewItem)

                NewItem=QTableWidgetItem(yingwo+'\n'+ pr_yw)
                NewItem.setTextAlignment(Qt.AlignCenter | Qt.AlignVCenter)
                self.table.setItem(i,10,NewItem)

                NewItem=QTableWidgetItem(ruanzuo+'\n'+ pr_rz)
                NewItem.setTextAlignment(Qt.AlignCenter | Qt.AlignVCenter)
                self.table.setItem(i,11,NewItem)

                NewItem=QTableWidgetItem(yingzuo+'\n'+ pr_yz)
                NewItem.setTextAlignment(Qt.AlignCenter | Qt.AlignVCenter)
                self.table.setItem(i,12,NewItem)

                NewItem=QTableWidgetItem(wuzuo+'\n'+ pr_wz)
                NewItem.setTextAlignment(Qt.AlignCenter | Qt.AlignVCenter)
                self.table.setItem(i,13,NewItem)

                NewItem=QTableWidgetItem(others+'\n'+'')
                NewItem.setTextAlignment(Qt.AlignCenter | Qt.AlignVCenter)
                self.table.setItem(i,14,NewItem)

                self.table.setRowHeight(i, 60)      #设置行高

                i=i+1
            #self.table.setSpan(0, 8, 2, 1)     #合并单元格
        else:
            if from_s not in stations.keys():
                # print('请输入正确的出发地')
                QMessageBox.warning(self,"提示","请输入正确的出发地!")
            if to_s not in stations.keys():
                # print('请输入正确的目的地')
                QMessageBox.warning(self,"提示","请输入正确的目的地!")
if __name__ == '__main__':
    app = QApplication(sys.argv)
    table = TableSheet()
    table.show()
    sys.exit(app.exec_())

三、效果展示

1)界面效果

2)时间日期

3)记录删除

到此这篇关于使用Python实现火车票查询系统(带界面)的文章就介绍到这了,更多相关Python火车票查询系统内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 使用Python实现火车票查询系统(带界面)

本文链接: https://www.lsjlt.com/news/119550.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 使用Python实现火车票查询系统(带界面)
    目录导语一、运行环境二、代码展示三、效果展示导语 周末、假期来了,七夕也快到了,又到一年中最一票难求的时候了! 那些假期想回家、过节异地恋的小可爱们,能准时抢到回家(约会对象)的城市...
    99+
    2024-04-02
  • C语言实现火车订票系统
    本文实例为大家分享了C语言实现火车订票系统的具体代码,供大家参考,具体内容如下 程序介绍 1.运行程序时,首先进入到菜单部分,菜单部分提供了菜单显示和输入功能部分。其运行效果如图所示...
    99+
    2022-11-13
    C语言火车订票系统 C语言火车订票 C语言订票系统
  • C语言实现火车票管理系统
    本文为大家分享了C语言实现火车票管理系统课程设计的具体代码,供大家参考,具体内容如下 1、前言 这是大一刚学C语言一个学期完成的课设项目,里面的功能还可以进一步的完善,仅供分享、参考...
    99+
    2024-04-02
  • Java实战之火车票预订系统的实现
    目录 一、项目运行二、效果图三、核心代码个人中心Controller管理员和员工登陆控制用户管理操作 一、项目运行 环境配置: Jdk1.8 + Tomcat8....
    99+
    2024-04-02
  • Java多线程实现模拟12306火车站售票系统
    该系统一共涉及到3个类: 车票(Ticket) 12306系统(System12306) 售票窗口(Window) 车票类,涉及三个属性: 起始...
    99+
    2024-04-02
  • Java实现火车票预订系统的代码怎么写
    本文小编为大家详细介绍“Java实现火车票预订系统的代码怎么写”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java实现火车票预订系统的代码怎么写”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。 一、项...
    99+
    2023-06-29
  • 怎么用Python实现全自动购买火车票
    这篇文章主要讲解了“怎么用Python实现全自动购买火车票”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用Python实现全自动购买火车票”吧!这个是实现结果,因为一天只能取消三次,所以...
    99+
    2023-06-15
  • Java中如何使用接口实现火车票实例
    这篇文章主要为大家展示了“Java中如何使用接口实现火车票实例”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java中如何使用接口实现火车票实例”这篇文章吧。import java.u...
    99+
    2023-06-02
  • 如何利用C++实现一个简单的火车票订购系统?
    随着人们工作和生活方式的变化,越来越多的人选择乘坐火车出行。因此,实现一个简单的火车票订购系统可以方便用户预订车票,同时也可以提高工作效率,减少人力投入。本文将介绍如何使用C++实现一个简单的火车票订购系统,以方便读者学习和实践。一、需求分...
    99+
    2023-11-03
    C++ 火车票 订购系统
  • Python编写车票订购系统 Python实现快递收费系统
    本文实例为大家分享了Python编写车票订购系统,Python实现快递收费系统的具体代码,供大家参考,具体内容如下 要求: 1.上网查询郑州到北京,西安,石家庄,济南,太原,武汉的距...
    99+
    2024-04-02
  • Java多线程如何实现模拟12306火车站售票系统
    这篇文章主要介绍Java多线程如何实现模拟12306火车站售票系统,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!该系统一共涉及到3个类:车票(Ticket)12306系统(System12306)售票窗口(Windo...
    99+
    2023-06-15
  • 教你用python实现12306余票查询
    python实现12306余票查询 我们说先在浏览器中打开开发者工具(F12),尝试一次余票的查询,通过开发者工具查看发出请求的包 余票查询界面 可以看到红框框中的URL就是我们向...
    99+
    2024-04-02
  • 利用Python实现电影订票系统
    目录一、效果展示二、整体结构图 三、代码分解3.1infos.py 3.2seat_book.py3.3film_selector.py3.4main....
    99+
    2024-04-02
  • 如何使用C++实现飞机订票系统
    小编给大家分享一下如何使用C++实现飞机订票系统,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体内容如下// 飞机订票系统.cpp :&nb...
    99+
    2023-06-29
  • 使用Python实现SSH隧道界面功能
    目录开发原因效果图源码分析构建隧道初始化加载开始服务停止服务移除服务不足之处源码地址开发原因 MobaXterm作为一个全能型终端神器,功能十分强大,我经常使用其中隧道功能,使用内部...
    99+
    2024-04-02
  • 如何使用C语言实现飞机订票系统
    这篇文章主要介绍了如何使用C语言实现飞机订票系统的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何使用C语言实现飞机订票系统文章都会有所收获,下面我们一起来看看吧。总体设计和需求分析设计目的怎样去合理的设计一个...
    99+
    2023-07-02
  • 怎么在Python和tkinter界面实现一个历史天气查询功能
    本篇文章给大家分享的是有关怎么在Python和tkinter界面实现一个历史天气查询功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。python可以做什么Python是一种编...
    99+
    2023-06-06
  • 如何使用C++实现航空订票系统课程
    这篇文章主要介绍如何使用C++实现航空订票系统课程,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体内容如下一、题目1.录入功能可以录入航班信息(如航班号,起飞降落时间,城市,座位数,票价)2.查询功能可以查询航班的...
    99+
    2023-06-29
  • 教你用python实现一个无界面的小型图书管理系统
    目录一、需求了解二、环境准备三、代码实现一、需求了解 功能模块 图书信息 二、环境准备 安装mysql数据库 参考文章: MySQL数据库压缩版本安装与配置 MySQL msi版...
    99+
    2024-04-02
  • VB.NET如何调用WMI来实现系统管理和系统信息查询
    这篇文章给大家分享的是有关VB.NET如何调用WMI来实现系统管理和系统信息查询的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。VB.Net调用WMI可以实现系统管理和系统信息查询等。WMI全称为Windows M...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作