PyQt 5 12306 차표 정보 프로그램의 실현

1.QT 환경 탑재
win+R 을 누 르 면 pip install pyqt 5 를 입력 하여 QT5 를 다운로드 할 수 있 습 니 다.물론 Qt 홈 페이지 에 다운로드 할 수 있 습 니 다.명령 행 을 사용 하 는 것 이 더 빠 르 고 편리 하기 때문에 명령 행 을 사용 하 는 것 을 권장 합 니 다.홈 페이지 에 다운로드 하여 설치 하 는 것 이 좋 습 니 다.
저 자 는 pyCharm 을 사용 하여 후기의 배경 프로그램 설정 을 완성 하고 pyCharm 외부 도구 링크 를 사용 하여 Designer,pyUIC,qrcTopy 프로그램 을 추가 합 니 다.
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2.주 창 설정
Qt5 메 인 프로그램 에 메 인 창 을 설정 하고 windows 로 저장 합 니 다.
만 든 python 항목 에 추가 한 다음 오른쪽 단 추 를 누 르 면->External toosl->Py UIC 를 선택 하여 ui 파일 을 py 파일 로 변환 합 니 다.
windows.py

from PyQt5.QtGui import QPalette, QPixmap, QColor


# result = []  #             


# UI 
class Ui_MainWindow(object):

    #   UI   
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")  #         
        MainWindow.resize(960, 786)  #       
        MainWindow.setMinimumSize(QtCore.QSize(960, 786))  #       
        MainWindow.setMaximumSize(QtCore.QSize(960, 786))  #       
        self.centralwidget = QtWidgets.QWidget(MainWindow)  #     widget  
        self.centralwidget.setObjectName("centralwidget")  #       

        #   label        
        self.label_title_img = QtWidgets.QLabel(self.centralwidget)
        self.label_title_img.setGeometry(QtCore.QRect(0, 0, 960, 141))
        self.label_title_img.setObjectName("label_title_img")
        title_img = QPixmap('img/TE3.png')  #       
        self.label_title_img.setPixmap(title_img)  #      

        #      widget
        self.widget_query = QtWidgets.QWidget(self.centralwidget)
        self.widget_query.setGeometry(QtCore.QRect(0, 141, 960, 80))
        self.widget_query.setObjectName("widget_query")
        #         
        self.widget_query.setAutoFillBackground(True)
        palette = QPalette()  #     
        palette.setBrush(QPalette.Background, QtGui.QBrush(QtGui.QPixmap('img/bg2.png')))  #       
        self.widget_query.setPalette(palette)  #              

        #             
        self.label = QtWidgets.QLabel(self.widget_query)
        self.label.setGeometry(QtCore.QRect(30, 30, 54, 12))
        self.label.setObjectName("label")
        self.textEdit = QtWidgets.QTextEdit(self.widget_query)
        self.textEdit.setGeometry(QtCore.QRect(80, 20, 104, 31))
        font = QtGui.QFont()  #   QFont()  
        font.setPointSize(13)  #            
        self.textEdit.setFont(font)  #        
        self.textEdit.setObjectName("textEdit")  #             

        #           
        self.label_2 = QtWidgets.QLabel(self.widget_query)
        self.label_2.setGeometry(QtCore.QRect(220, 30, 54, 12))
        self.label_2.setObjectName("label_2")
        self.textEdit_2 = QtWidgets.QTextEdit(self.widget_query)
        self.textEdit_2.setGeometry(QtCore.QRect(270, 20, 104, 31))
        font = QtGui.QFont()
        font.setPointSize(13)
        self.textEdit_2.setFont(font)
        self.textEdit_2.setObjectName("textEdit_2")

        #            
        self.label_3 = QtWidgets.QLabel(self.widget_query)
        self.label_3.setGeometry(QtCore.QRect(410, 30, 54, 12))
        self.label_3.setObjectName("label_3")
        self.textEdit_3 = QtWidgets.QTextEdit(self.widget_query)
        self.textEdit_3.setGeometry(QtCore.QRect(460, 20, 104, 31))
        font = QtGui.QFont()
        font.setPointSize(13)
        self.textEdit_3.setFont(font)
        self.textEdit_3.setObjectName("textEdit_3")
        #     
        self.pushButton = QtWidgets.QPushButton(self.widget_query)
        self.pushButton.setGeometry(QtCore.QRect(610, 20, 91, 31))
        self.pushButton.setObjectName("pushButton")

        #        widget
        self.widget_checkBox = QtWidgets.QWidget(self.centralwidget)
        self.widget_checkBox.setGeometry(QtCore.QRect(0, 220, 961, 35))
        self.widget_checkBox.setAutoFillBackground(False)
        self.widget_checkBox.setObjectName("widget_checkBox")
        #         
        self.widget_checkBox.setAutoFillBackground(True)
        palette = QPalette()  #     
        palette.setBrush(QPalette.Background, QtGui.QBrush(QtGui.QPixmap('img/bg3.png')))  #       
        self.widget_checkBox.setPalette(palette)  #               

        #         
        self.label_type = QtWidgets.QLabel(self.widget_checkBox)
        self.label_type.setGeometry(QtCore.QRect(30, 9, 65, 16))
        font = QtGui.QFont()
        font.setPointSize(10)
        self.label_type.setFont(font)
        self.label_type.setObjectName("label_type")

        #     
        self.checkBox_G = QtWidgets.QCheckBox(self.widget_checkBox)
        self.checkBox_G.setGeometry(QtCore.QRect(100, 9, 70, 17))
        font = QtGui.QFont()
        font.setPointSize(10)
        self.checkBox_G.setFont(font)
        self.checkBox_G.setObjectName("checkBox_GC")

        #     
        self.checkBox_D = QtWidgets.QCheckBox(self.widget_checkBox)
        self.checkBox_D.setGeometry(QtCore.QRect(258, 9, 63, 17))
        font = QtGui.QFont()
        font.setPointSize(10)
        self.checkBox_D.setFont(font)
        self.checkBox_D.setObjectName("checkBox_D")
        #     
        self.checkBox_Z = QtWidgets.QCheckBox(self.widget_checkBox)
        self.checkBox_Z.setGeometry(QtCore.QRect(415, 9, 63, 17))
        font = QtGui.QFont()
        font.setPointSize(10)
        self.checkBox_Z.setFont(font)
        self.checkBox_Z.setObjectName("checkBox_Z")
        #     
        self.checkBox_T = QtWidgets.QCheckBox(self.widget_checkBox)
        self.checkBox_T.setGeometry(QtCore.QRect(572, 9, 63, 17))
        font = QtGui.QFont()
        font.setPointSize(10)
        self.checkBox_T.setFont(font)
        self.checkBox_T.setObjectName("checkBox_T")
        #     
        self.checkBox_K = QtWidgets.QCheckBox(self.widget_checkBox)
        self.checkBox_K.setGeometry(QtCore.QRect(730, 9, 63, 17))
        font = QtGui.QFont()
        font.setPointSize(10)
        self.checkBox_K.setFont(font)
        self.checkBox_K.setObjectName("checkBox_K")

        #   label          
        self.label_train_img = QtWidgets.QLabel(self.centralwidget)
        self.label_train_img.setGeometry(QtCore.QRect(0, 256, 960, 62))
        self.label_train_img.setObjectName("label_train_img")
        train_img = QPixmap('img/bg4.png')  #         
        self.label_train_img.setPixmap(train_img)  #      
        #          
        self.tableView = QtWidgets.QTableView(self.centralwidget)
        self.tableView.setGeometry(QtCore.QRect(0, 320, 960, 440))
        self.tableView.setObjectName("tableView")
        self.model = QStandardItemModel()#          
        #                     
        self.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
        #        
        self.tableView.horizontalHeader().setVisible(False)
        #        
        self.tableView.verticalHeader().setVisible(False)
        #           
        font = QtGui.QFont()
        font.setPointSize(10)
        self.tableView.setFont(font)
        #           
        self.tableView.setEditTriggers(QAbstractItemView.NoEditTriggers)
        #          
        self.tableView.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
        #       Widget
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)  #   retranslateUi        
        QtCore.QMetaObject.connectSlotsByName(MainWindow)  #      

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "  "))
        self.checkBox_T.setText(_translate("MainWindow", "T-  "))
        self.checkBox_K.setText(_translate("MainWindow", "K-  "))
        self.checkBox_Z.setText(_translate("MainWindow", "Z-  "))
        self.checkBox_D.setText(_translate("MainWindow", "D-  "))
        self.checkBox_G.setText(_translate("MainWindow", "GC-  "))
        self.label_type.setText(_translate("MainWindow", "    :"))
        self.label.setText(_translate("MainWindow", "   :"))
        self.label_2.setText(_translate("MainWindow", "   :"))
        self.label_3.setText(_translate("MainWindow", "   :"))
        self.pushButton.setText(_translate("MainWindow", "  "))
def show_MainWindow():
    app = QtWidgets.QApplication(sys.argv)  #        QApplication ,  GUI     
    MainWindow = QtWidgets.QMainWindow()  #    QtWidgets.QMainWindow ,    menu     QMainWindow
    ui = Ui_MainWindow()  #   UI 
    ui.setupUi(MainWindow)  #     UI
    MainWindow.show()  #     
    sys.exit(app.exec_())  #                    ,
    #          (mainloop)  ,
    #        ,         ,
    #      sys.exit()   ,         ,
    #       。    app.exec_()   app.exec()?
    #   exec python       ,      ,    exec_


if __name__ == "__main__":
    if isStations() == False:  #             ,     ,        
        getStation()  #         
        show_MainWindow()  #          
    else:
        show_MainWindow()  #          
3.사이트 파일 다운로드
그 전에 저희 가 12306 사이트 에 가서 관련 파 라미 터 를 분석 해 보도 록 하 겠 습 니 다.
在这里插入图片描述
완전한 검표 주 소 를 가 져 옵 니 다.모든 시기의 주소 가 바 뀔 수 있 으 니 주의 하 십시오.
사이트 파일 다운로드 에 사용 할 py 파일 만 들 기,getstations.py

import re
import  requests
import os

def getStation():
    #             ,                 
    url = 'https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9190'
    response = requests.get(url, verify=True)  #        
    stations = re.findall(u'([\u4e00-\u9fa5]+)\|([A-Z]+)', response.text)  #          
    stations = dict(stations)  #    dic
    stations = str(stations)  #                 
    write(stations)           #      
def write(stations):
    file = open('stations.text', 'w', encoding='utf_8_sig')  #         
    file.write(stations)  #     
    file.close()
def read():
    file = open('stations.text', 'r', encoding='utf_8_sig')  #         
    data = file.readline()                                  #    
    file.close()
    return data

def isStations():
    isStations = os.path.exists('stations.text')      #          
    return isStations

4.차표 정보의 요청 과 표시
query 생 성request.py 파일 은 데 이 터 를 발견 한 후 처리 하 는 데 사 용 됩 니 다.

from get_stations import *
import requests

'''5-7     3     6      8       9       10    26    29   
   24    28    33    23    21      30     31     32       
'''
data = []  #             
type_data = []  #             
headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36',
           'Cookie':'_uab_collina=162044599452968647580256; JSESSIONID=ABB3D0F36AA12C3E5DAD5CD1D3CFF031; '
                    'RAIL_EXPIRATION=1620786883959; RAIL_DEVICEID=hu-C8-xxpDNSCuX_BiPS1CGOlxAyoXu-dncsv32QDPvmjG'
                    'R9Ua0AUywoyJ6FDeqRWMoixIIL24hbMf9ucn2MrHcPWjgYFJ6y6Fon9ihvKvZV8SIiGDYmZTuR-S2OLu3wyezmWPPO'
                    'un2B-v2BR_Q0wEYkIrBLIE8j; _jc_save_fromStation=%u5317%u4EAC%2CBJP; _jc_save_toStation=%u4E0'
                    'A%u6D77%2CSHH; _jc_save_fromDate=2021-05-08; _jc_save_toDate=2021-05-08; _jc_save_wfdc_flag='
                    'dc; BIGipServerpassport=988283146.50215.0000; route=495c805987d0f5c8c84b14f60212447d; BIGipS'
                    'erverotn=417857802.50210.0000; BIGipServerportal=3084124426.17183.0000'}
def query(date, from_station, to_station):
    data.clear()  #     
    type_data.clear()  #            
    #       
    url = 'https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date={}&leftTicketDTO.from_station={}&leftTicketDTO.to_station={}&purpose_codes=ADULT'.format(
        date, from_station, to_station)
    #       
    response = requests.get(url=url,headers=headers)
    # #  json         ,        
    result = response.json()
    result = result['data']['result']
    #           
    if isStations() == True:
        stations = eval(read())  #           dic  
        if len(result) != 0:  #           
            for i in result:
                # #            
                tmp_list = i.split('|')
                #                       ,                  
                from_station = list(stations.keys())[list(stations.values()).index(tmp_list[6])]
                to_station = list(stations.keys())[list(stations.values()).index(tmp_list[7])]
                #       ,              “”,      --     
                seat = [tmp_list[3], from_station, to_station, tmp_list[8], tmp_list[9], tmp_list[10]
                    , tmp_list[32], tmp_list[31], tmp_list[30], tmp_list[21]
                    , tmp_list[23], tmp_list[33], tmp_list[28], tmp_list[24], tmp_list[29], tmp_list[26]]
                newSeat = []
                #            “”,  --     
                for s in seat:
                    if s == "":
                        s = "--"
                    else:
                        s = s
                    newSeat.append(s)  #         
                data.append(newSeat)
        return data  #           


#          
def g_vehicle():
    if len(data) != 0:
        for g in data:  #         
            i = g[0].startswith('G')  #             
            if i:  #                 
                type_data.append(g)


#          
def r_g_vehicle():
    if len(data) != 0 and len(type_data) != 0:
        for g in data:
            i = g[0].startswith('G')
            if i:  #       
                type_data.remove(g)


#          
def d_vehicle():
    if len(data) != 0:
        for d in data:  #         
            i = d[0].startswith('D')  #             
            if i == True:  #                 
                type_data.append(d)


#          
def r_d_vehicle():
    if len(data) != 0 and len(type_data) != 0:
        for d in data:
            i = d[0].startswith('D')
            if i == True:  #       
                type_data.remove(d)


#           
def z_vehicle():
    if len(data) != 0:
        for z in data:  #         
            i = z[0].startswith('Z')  #             
            if i == True:  #                 
                type_data.append(z)


#           
def r_z_vehicle():
    if len(data) != 0 and len(type_data) != 0:
        for z in data:
            i = z[0].startswith('Z')
            if i == True:  #        
                type_data.remove(z)


#           
def t_vehicle():
    if len(data) != 0:
        for t in data:  #         
            i = t[0].startswith('T')  #             
            if i == True:  #                  
                type_data.append(t)


#           
def r_t_vehicle():
    if len(data) != 0 and len(type_data) != 0:
        for t in data:
            i = t[0].startswith('T')
            if i == True:  #        
                type_data.remove(t)


#           
def k_vehicle():
    if len(data) != 0:
        for k in data:  #         
            i = k[0].startswith('K')  #             
            if i == True:  #                 
                type_data.append(k)


#           
def r_k_vehicle():
    if len(data) != 0 and len(type_data) != 0:
        for k in data:
            i = k[0].startswith('K')
            if i == True:  #       
                type_data.remove(k)

5.주 창 에 검표 정보 표시
이 방법 들 은 windows.py 에 쓰 여 있 습 니 다.
(1)get 생 성time 와 isvalid.date 방법 으로 날짜 가 유효한 지 판단 합 니 다.

def get_time():
    #          
    now = int(time.time())
    #          , :"%Y-%m-%d %H:%M:%S"
    timeStruct = time.localtime(now)
    strTime = time.strftime("%Y-%m-%d", timeStruct)
    return strTime


def is_valid_date(str):
    '''               '''
    try:
        time.strptime(str, "%Y-%m-%d")
        return True
    except:
        return False

(2)차량 분류 복선 이벤트 처리 방법 만 들 기

 #               
    def checkBox_default(self):
        self.checkBox_G.setChecked(False)
        self.checkBox_D.setChecked(False)
        self.checkBox_Z.setChecked(False)
        self.checkBox_T.setChecked(False)
        self.checkBox_K.setChecked(False)

    #          
    def change_G(self, state):
        #                     
        if state == QtCore.Qt.Checked:
            #       
            g_vehicle()
            #            
            self.displayTable(len(type_data), 16, type_data)
        else:
            #             
            r_g_vehicle()
            self.displayTable(len(type_data), 16, type_data)

    #          
    def change_D(self, state):
        #                     
        if state == QtCore.Qt.Checked:
            #       
            d_vehicle()
            #            
            self.displayTable(len(type_data), 16, type_data)

        else:
            #             
            r_d_vehicle()
            self.displayTable(len(type_data), 16, type_data)

    #          
    def change_Z(self, state):
        #                      
        if state == QtCore.Qt.Checked:
            #        
            z_vehicle()
            self.displayTable(len(type_data), 16, type_data)
        else:
            #             
            r_z_vehicle()
            self.displayTable(len(type_data), 16, type_data)

    #          
    def change_T(self, state):
        #                      
        if state == QtCore.Qt.Checked:
            #        
            t_vehicle()
            self.displayTable(len(type_data), 16, type_data)
        else:
            #             
            r_t_vehicle()
            self.displayTable(len(type_data), 16, type_data)

    #          
    def change_K(self, state):
        #                     
        if state == QtCore.Qt.Checked:
            #        
            k_vehicle()
            self.displayTable(len(type_data), 16, type_data)

        else:
            #             
            r_k_vehicle()
            self.displayTable(len(type_data), 16, type_data)

(3)message Dialog 와 displayTable 을 만 드 는 방법 은 각각 불법 입력 처리 와 차량 정보 표시 에 사 용 됩 니 다.

#        ,  title        ,message     
    def messageDialog(self, title, message):
        msg_box = QMessageBox(QMessageBox.Warning, title, message)
        msg_box.exec_()

    #          
    # train          ,         。
    # info            ,    、     。         
    def displayTable(self, train, info, data):
        self.model.clear()
        for row in range(train):
            for column in range(info):
                #       
                item = QStandardItem(data[row][column])
                #                 
                self.model.setItem(row, column, item)
        #            
        self.tableView.setModel(self.model)
(4)창설 onclick 방법

    #          
    def on_click(self):
        get_from = self.textEdit.toPlainText()  #      
        get_to = self.textEdit_2.toPlainText()  #      
        get_date = self.textEdit_3.toPlainText()  #       
        #           
        if isStations() == True:
            stations = eval(read())  #           dic  
            #           ,   、   、    
            if get_from != "" and get_to != "" and get_date != "":
                #              ,          
                if get_from in stations and get_to in stations and is_valid_date(get_date):
                    #                       
                    inputYearDay = time.strptime(get_date, "%Y-%m-%d").tm_yday
                    #                        
                    yearToday = time.localtime(time.time()).tm_yday
                    #      ,                 
                    timeDifference = inputYearDay - yearToday
                    #       0           ,
                    #   29      。12306        30      
                    if timeDifference >= 0 and timeDifference <= 28:
                        from_station = stations[get_from]  #                ,   
                        to_station = stations[get_to]  #    
                        data = query(get_date, from_station, to_station)  #       ,        
                        self.checkBox_default()
                        if len(data) != 0:  #            
                            #                     
                            self.displayTable(len(data), 16, data)
                        else:
                            self.messageDialog('  ', '         !')
                    else:
                        self.messageDialog('  ', '          ,'
                                                 '           ,  29        !')
                else:
                    self.messageDialog('  ', '        ,        !')
            else:
                self.messageDialog('  ', '       !')
        else:
            self.messageDialog('  ', '         !')
(5)retranslateUi 방법 에 다음 과 같은 코드 를 추가 합 니 다.

        self.textEdit_3.setText(get_time())  #          
        self.pushButton.clicked.connect(self.on_click)  #              
        self.checkBox_G.stateChanged.connect(self.change_G)  #          
        self.checkBox_D.stateChanged.connect(self.change_D)  #          
        self.checkBox_Z.stateChanged.connect(self.change_Z)  #           
        self.checkBox_T.stateChanged.connect(self.change_T)  #           
        self.checkBox_K.stateChanged.connect(self.change_K)  #          
여기까지 입 니 다.다음은 실행 결과 입 니 다.
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
여기 서 PyQt 5 가 12306 차표 정보 프로그램의 실현 에 관 한 글 을 소개 합 니 다.더 많은 관련 PyQt 5 가 12306 을 얻 었 습 니 다.예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기