PyQt5+requests实现车票查询工具


Posted in Python onJanuary 21, 2019

PyQt5+requests实现一个车票查询工具,供大家参考,具体内容如下

结构图

PyQt5+requests实现车票查询工具

效果图

PyQt5+requests实现车票查询工具

思路

1、search(QPushButton)点击信号(clicked)连接到自定义的槽函数(event.search)
2、槽函数(event.search)接收四个参数:QTableWidget对象的引用、两个QLabel中的内容(站台名称)、QDateEdit格式化日期
3、槽函数(event.search)调用爬虫类(TrainService)获取车次信息,添加到QTableWidget对象中。

代码

1、ui.py(ui界面)

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'E:\Python\Qt\ui_0.ui'
#
# Created by: PyQt5 UI code generator 5.11.2
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets
from Event import EventClass
class Ui_MainWindow(object):
 def setupUi(self, MainWindow):
 event=EventClass()
 MainWindow.setObjectName("MainWindow")
 MainWindow.resize(793, 604)
 MainWindow.setStyleSheet("font: 10pt \"Microsoft YaHei UI\";")
 self.centralwidget = QtWidgets.QWidget(MainWindow)
 self.centralwidget.setObjectName("centralwidget")
 self.widget = QtWidgets.QWidget(self.centralwidget)
 self.widget.setGeometry(QtCore.QRect(0, 0, 791, 43))
 self.widget.setObjectName("widget")
 self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget)
 self.horizontalLayout.setSizeConstraint(QtWidgets.QLayout.SetNoConstraint)
 self.horizontalLayout.setContentsMargins(10, 1, 1, 3)
 self.horizontalLayout.setSpacing(15)
 self.horizontalLayout.setObjectName("horizontalLayout")
 self.label = QtWidgets.QLabel(self.widget)
 self.label.setObjectName("label")
 self.horizontalLayout.addWidget(self.label)
 self.lineEdit = QtWidgets.QLineEdit(self.widget)
 self.lineEdit.setMaximumSize(QtCore.QSize(742, 16777215))
 self.lineEdit.setObjectName("lineEdit")
 self.horizontalLayout.addWidget(self.lineEdit)
 self.label_2 = QtWidgets.QLabel(self.widget)
 self.label_2.setObjectName("label_2")
 self.horizontalLayout.addWidget(self.label_2)
 self.lineEdit_2 = QtWidgets.QLineEdit(self.widget)
 self.lineEdit_2.setObjectName("lineEdit_2")
 self.horizontalLayout.addWidget(self.lineEdit_2)
 self.dateEdit = QtWidgets.QDateEdit(self.widget)
 self.dateEdit.setDate(QtCore.QDate(2019, 1, 1))
 self.dateEdit.setObjectName("dateEdit")
 self.horizontalLayout.addWidget(self.dateEdit)
 self.pushButton = QtWidgets.QPushButton(self.widget)
 self.pushButton.setObjectName("pushButton")
 self.horizontalLayout.addWidget(self.pushButton)
 self.scrollArea = QtWidgets.QScrollArea(self.centralwidget)
 self.scrollArea.setGeometry(QtCore.QRect(0, 40, 791, 561))
 self.scrollArea.setWidgetResizable(True)
 self.scrollArea.setObjectName("scrollArea")
 self.scrollAreaWidgetContents = QtWidgets.QWidget()
 self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 789, 559))
 self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents")
 self.tableWidget = QtWidgets.QTableWidget(self.scrollAreaWidgetContents)
 self.tableWidget.setGeometry(QtCore.QRect(0, 0, 791, 561))
 sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
 sizePolicy.setHorizontalStretch(0)
 sizePolicy.setVerticalStretch(0)
 sizePolicy.setHeightForWidth(self.tableWidget.sizePolicy().hasHeightForWidth())
 self.tableWidget.setSizePolicy(sizePolicy)
 self.tableWidget.setBaseSize(QtCore.QSize(0, 0))
 self.tableWidget.setObjectName("tableWidget")
 self.tableWidget.setColumnCount(5)
 self.tableWidget.setRowCount(0)
 item = QtWidgets.QTableWidgetItem()
 self.tableWidget.setHorizontalHeaderItem(0, item)
 item = QtWidgets.QTableWidgetItem()
 self.tableWidget.setHorizontalHeaderItem(1, item)
 item = QtWidgets.QTableWidgetItem()
 self.tableWidget.setHorizontalHeaderItem(2, item)
 item = QtWidgets.QTableWidgetItem()
 self.tableWidget.setHorizontalHeaderItem(3, item)
 item = QtWidgets.QTableWidgetItem()
 self.tableWidget.setHorizontalHeaderItem(4, item)
 self.tableWidget.horizontalHeader().setDefaultSectionSize(155)
 self.tableWidget.verticalHeader().setDefaultSectionSize(47)
 self.tableWidget.verticalHeader().setMinimumSectionSize(45)
 self.line = QtWidgets.QFrame(self.scrollAreaWidgetContents)
 self.line.setGeometry(QtCore.QRect(0, 23, 784, 31))
 self.line.setToolTipDuration(0)
 self.line.setLineWidth(1)
 self.line.setFrameShape(QtWidgets.QFrame.HLine)
 self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
 self.line.setObjectName("line")
 self.scrollArea.setWidget(self.scrollAreaWidgetContents)
 MainWindow.setCentralWidget(self.centralwidget)

 self.retranslateUi(MainWindow)
 self.pushButton.clicked.connect(lambda :event.search(self.tableWidget, self.lineEdit.text(), self.lineEdit_2.text(), self.dateEdit.date().toPyDate()))
 QtCore.QMetaObject.connectSlotsByName(MainWindow)

 def retranslateUi(self, MainWindow):
 _translate = QtCore.QCoreApplication.translate
 MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
 self.label.setText(_translate("MainWindow", "From"))
 self.label_2.setText(_translate("MainWindow", "To"))
 self.pushButton.setText(_translate("MainWindow", "search"))
 item = self.tableWidget.horizontalHeaderItem(0)
 item.setText(_translate("MainWindow", "车次"))
 item = self.tableWidget.horizontalHeaderItem(1)
 item.setText(_translate("MainWindow", "出发时间"))
 item = self.tableWidget.horizontalHeaderItem(2)
 item.setText(_translate("MainWindow", "到站时间"))
 item = self.tableWidget.horizontalHeaderItem(3)
 item.setText(_translate("MainWindow", "硬卧"))
 item = self.tableWidget.horizontalHeaderItem(4)
 item.setText(_translate("MainWindow", "硬座"))


if __name__ == "__main__":
 import sys
 app = QtWidgets.QApplication(sys.argv)
 MainWindow = QtWidgets.QMainWindow()
 ui = Ui_MainWindow()
 ui.setupUi(MainWindow)
 MainWindow.show()
 sys.exit(app.exec_())

2、EventClass.py(自定义槽函数类)

#coding:u8
import time
from PyQt5.QtWidgets import QTableWidgetItem
from TrainService import TrainService
class EventClass(object):
 def __init__(self):
 self.trainService=TrainService()
 pass
 def search(self, table, From="北京", To="上海", Date=time.strftime("%Y-%m-%d", time.localtime())):
 print("【{}】 form {} to {}".format(Date, From, To))
 train_list=self.trainService.crawlTrainMess(From, To, Date)
 print(table)
 table.setRowCount(len(train_list))
 for row, item in enumerate(train_list):
  for col, i in enumerate(item):
  if i is "":
   i="0"
  table.setItem(row, col, QTableWidgetItem(i))
 pass

3、TrainService.py(爬虫类)

#coding_url:u8
import requests
import json
class TrainService(object):
 def __init__(self):
 with open("code.json", 'r') as file:
  code=eval(file.read())
 self.code=code
 self.code_url="https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9002"
 self.headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.7 Safari/537.36"}
 
 def crawlTrainMess(self,from_station,to_station,train_date):
 self.url="https://kyfw.12306.cn/otn/leftTicket/queryZ?leftTicketDTO.train_date={}&leftTicketDTO.from_station={}&leftTicketDTO.to_station={}&purpose_codes=ADULT".format(train_date,self.code[from_station],self.code[to_station])
 response=requests.get(self.url,headers=self.headers)
 train_json=json.loads(response.text)
 results=train_json['data']['result']
 train_list=[]
 for i in results:
  temp=i.split('|')
  train_list.append([temp[3], temp[8], temp[9], temp[25], temp[26]])
 #print(train_list)
 return train_list
 def crawlCodeMess(self):
 response=requests.get(self.code_url,headers=self.headers)
 station_list=response.text.split('@')[1 :]
 code={}
 for i in station_list:
  temp=i.split('|')
  code[temp[1]]=temp[2]
 #print(code)
 with open("code.json", 'w') as file:
  file.write(str(code))
 
if __name__=="__main__":
 ts=TrainService()
 ts.crawlCodeMess()

需要先跑 TrainService.py 获取到站点对应的代码信息code.json
然后在执行 ui.py

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用Python中PDB模块中的命令来调试Python代码的教程
Mar 30 Python
Python对数据库操作
Mar 28 Python
python 转换 Javascript %u 字符串为python unicode的代码
Sep 06 Python
总结python实现父类调用两种方法的不同
Jan 15 Python
python 从csv读数据到mysql的实例
Jun 21 Python
详解python 注释、变量、类型
Aug 10 Python
python调用百度语音REST API
Aug 30 Python
python实现代码统计器
Sep 19 Python
django数据模型on_delete, db_constraint的使用详解
Dec 24 Python
python3通过qq邮箱发送邮件以及附件
May 20 Python
Python如何输出百分比
Jul 31 Python
linux mint中搜狗输入法导致pycharm卡死的问题
Oct 28 Python
Python设计模式之策略模式实例详解
Jan 21 #Python
Python设计模式之装饰模式实例详解
Jan 21 #Python
python利用Tesseract识别验证码的方法示例
Jan 21 #Python
对python过滤器和lambda函数的用法详解
Jan 21 #Python
利用Python正则表达式过滤敏感词的方法
Jan 21 #Python
Python 实现王者荣耀中的敏感词过滤示例
Jan 21 #Python
opencv python统计及绘制直方图的方法
Jan 21 #Python
You might like
PHP的substr_replace将指定两位置之间的字符替换为*号
2011/05/04 PHP
浅析php工厂模式
2014/11/25 PHP
PHP实现唤起微信支付功能
2019/02/18 PHP
PHP设计模式之简单工厂和工厂模式实例分析
2019/03/25 PHP
javascript document.referrer 用法
2009/04/30 Javascript
斜45度寻路实现函数
2009/08/20 Javascript
Ruffy javascript 学习笔记
2009/11/30 Javascript
jQuery中ajax的使用与缓存问题的解决方法
2013/12/19 Javascript
js控制容器隐藏出现防止样式变化的两种方法
2014/04/25 Javascript
JS实现网页游戏中滑块响应鼠标点击移动效果
2015/10/19 Javascript
jQuery实现鼠标滑过链接控制图片的滑动展开与隐藏效果
2015/10/28 Javascript
jQuery控制li上下循环滚动插件用法实例(附demo源码下载)
2016/05/28 Javascript
JavaScript对Json的增删改属性详解
2016/06/02 Javascript
jQuery Ajax File Upload实例源码
2016/12/12 Javascript
js实现textarea限制输入字数
2017/02/13 Javascript
Vue.js常用指令之循环使用v-for指令教程
2017/06/27 Javascript
knockoutjs模板实现树形结构列表
2017/07/31 Javascript
基于vue+echarts 数据可视化大屏展示的方法示例
2020/03/09 Javascript
浅谈vue的第一个commit分析
2020/06/08 Javascript
视觉直观感受若干常用排序算法
2017/04/13 Python
Python入门_条件控制(详解)
2017/05/16 Python
Python数据分析之双色球基于线性回归算法预测下期中奖结果示例
2018/02/08 Python
对Python 2.7 pandas 中的read_excel详解
2018/05/04 Python
在Python中Dataframe通过print输出多行时显示省略号的实例
2018/12/22 Python
celery4+django2定时任务的实现代码
2018/12/23 Python
Python网络编程之使用TCP方式传输文件操作示例
2019/11/01 Python
动态设置django的model field的默认值操作步骤
2020/03/30 Python
HTML5的革新 结构之美
2011/06/20 HTML / CSS
英国票务网站:Ticketmaster英国
2018/08/27 全球购物
施华洛世奇西班牙官网:SWAROVSKI西班牙
2019/06/06 全球购物
将相和教学反思
2014/02/04 职场文书
计算机专业求职信
2014/06/02 职场文书
奥巴马当选演讲稿
2014/09/10 职场文书
机关干部四风问题自我剖析及整改措施
2014/10/26 职场文书
2016年党校科级干部培训班学习心得体会
2016/01/06 职场文书
MySQL主从切换的超详细步骤
2022/06/28 MySQL