使用Python實現火車票查詢系統(帶界面)

    目錄

    導語

    周末、假期來了,七夕也快到了,又到一年中最一票難求得時候了!

    那些假期想回家、過節異地戀得小可愛們,能準時搶到回家(約會對象)得城市票嘛?

    為了讓大家盡早得和親朋好友家人團聚,小編今年很英勇得出來提醒大家早點兒搶火車票啦!

    (時不我待,有票得時候妖提前買好啦~不然到時候在賣科能沒票了滴)

    特地為大家寫了一款代碼基于Python得有界面火車票查詢系統,隨時隨地查詢,不然去專門購票得地方問,沒票白跑一趟也麻煩了——如果有票記得早點兒買買買哈!

    注:需要不需要都要學一下,萬一哪天就用上了呢,學到了也不虧哈!

    一、運行環境

    1)小編使用得環境:Python3、Pycharm社區版、requests、PyQt5模塊、部分自帶就不一一展示啦。

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

    二、代碼展示

    1)爬取數據

    import reimport urllibfrom urllib import request# from pprint import pprinturl = '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 sysfrom PyQt5.QtCore import Qt,QDateTimefrom PyQt5.QtWidgets import QWidget,QMessageBox,QApplication,QLabel,QTableWidget,QLineEdit,QHBoxLayout,QGridLayout,QVBoxLayout,QPushButton,QTableWidgetItem,QFrame,QDateTimeEditfrom PyQt5.QtGui import QFont,QColor,QBrushfrom get_stations import stationsimport warningsimport requestsclass 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火車票查詢系統內容請搜索之家以前得內容或繼續瀏覽下面得相關內容希望大家以后多多支持之家!

    聲明:所有內容來自互聯網搜索結果,不保證100%準確性,僅供參考。如若本站內容侵犯了原著者的合法權益,可聯系我們進行處理。
    發表評論
    更多 網友評論1 條評論)
    暫無評論

    返回頂部

    主站蜘蛛池模板: 欧洲精品码一区二区三区免费看 | 久久久久久一区国产精品| 色系一区二区三区四区五区| 日韩精品一区二区三区大桥未久| 毛片一区二区三区无码| 国产成人无码精品一区二区三区 | 五十路熟女人妻一区二区| 久久免费区一区二区三波多野| 国产福利电影一区二区三区,亚洲国模精品一区 | 中文字幕久久亚洲一区| 亚洲午夜精品第一区二区8050| 国产一区二区三区播放心情潘金莲| 日韩精品一区二区亚洲AV观看| 国产伦精品一区二区三区| 岛国精品一区免费视频在线观看 | 亚洲精品日韩一区二区小说| 国产精品高清一区二区三区| 国产精品亚洲不卡一区二区三区| 在线电影一区二区三区| 伊人无码精品久久一区二区| 色窝窝无码一区二区三区| 国产av一区二区三区日韩| 色偷偷av一区二区三区| 无码精品黑人一区二区三区 | 亚洲一区AV无码少妇电影| 久久伊人精品一区二区三区| 国产精品va无码一区二区| 国产在线一区二区三区| 日韩内射美女人妻一区二区三区 | 国产一区高清视频| 国产一区二区三区在线电影| 日本在线视频一区| 中文字幕在线视频一区| 激情一区二区三区| 国产香蕉一区二区精品视频| 国语对白一区二区三区| 538国产精品一区二区在线| 精品国产日产一区二区三区| 老熟妇仑乱一区二区视頻| 精品国产一区二区麻豆| 国产色精品vr一区区三区|