PyQt 5 12306 차표 정보 프로그램의 실현
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 을 얻 었 습 니 다.예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Qt Designer와 PyQt5로 GUI인 MQTT 구독자를 만들 때의 메모직장의 건물이 신축되었으므로, 각 층의 분전반에 전력계를 설치해, 1곳에서 모니터링할 수 있는 시스템을 구축하려고 생각했다. 전력계는 을 참고로 제작했다. 시스템의 전체도 Windows10상에, 선인의 지혜를 참고로...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.