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中的MySQLdb模块添加超时功能的教程
May 05 Python
python爬取淘宝商品详情页数据
Feb 23 Python
Python解析命令行读取参数之argparse模块
Jul 26 Python
一篇文章搞定Python操作文件与目录
Aug 13 Python
Python使用pyexecjs代码案例解析
Jul 13 Python
Python CategoricalDtype自定义排序实现原理解析
Sep 11 Python
python批量修改文件名的示例
Sep 27 Python
python 如何使用find和find_all爬虫、找文本的实现
Oct 16 Python
浅析关于Keras的安装(pycharm)和初步理解
Oct 23 Python
python 解决Windows平台上路径有空格的问题
Nov 10 Python
Python爬虫简单运用爬取代理IP的实现
Dec 01 Python
总结三种用 Python 作为小程序后端的方式
May 02 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下判断数组中是否存在相同的值array_unique
2008/03/25 PHP
Blitz templates 最快的PHP模板引擎
2010/04/06 PHP
纯PHP生成的一个树叶图片画图例子
2014/04/16 PHP
php自动识别文件编码并转换为UTF-8的方法
2014/06/12 PHP
浅谈COOKIE和SESSION区别
2015/07/19 PHP
javascript 支持链式调用的异步调用框架Async.Operation
2009/08/04 Javascript
基于jquery的鼠标拖动效果代码
2012/05/30 Javascript
Javascript中常见的校验如域名、手机、邮箱等等
2014/01/02 Javascript
如何设置一定时间内只能发送一次请求
2014/02/28 Javascript
学习使用jQuery表单验证插件和日历插件
2017/02/13 Javascript
Angularjs+bootstrap+table多选(全选)支持单击行选中实现编辑、删除功能
2017/03/27 Javascript
使用 Node.js 对文本内容分词和关键词抽取
2017/05/27 Javascript
在Vue中使用axios请求拦截的实现方法
2018/10/25 Javascript
Node.js 实现抢票小工具 & 短信通知提醒功能
2019/10/22 Javascript
浅谈Vue SSR中的Bundle的具有使用
2019/11/21 Javascript
js实现无缝轮播图特效
2020/05/09 Javascript
[53:13]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第三场 1月18日
2021/03/11 DOTA
python中matplotlib实现最小二乘法拟合的过程详解
2017/07/11 Python
Python实现E-Mail收集插件实例教程
2019/02/06 Python
浅谈Django2.0 加xadmin踩的坑
2019/11/15 Python
解决os.path.isdir() 判断文件夹却返回false的问题
2019/11/29 Python
Python selenium的基本使用方法分析
2019/12/21 Python
python 负数取模运算实例
2020/06/03 Python
css3媒体查询中device-width和width的区别详解
2020/03/27 HTML / CSS
比利时香水网上商店:NOTINO
2018/03/28 全球购物
俄罗斯鲜花递送:AMF
2020/04/24 全球购物
求网格中的黑点分布
2013/11/06 面试题
什么是Rollback Segment
2013/04/22 面试题
职工趣味运动会方案
2014/02/10 职场文书
党的群众路线教育实践活动心得体会(教师)
2014/10/31 职场文书
给朋友的赠语
2015/06/23 职场文书
2015年校本培训工作总结
2015/07/24 职场文书
2015元旦感言
2015/12/09 职场文书
3招让你摆脱即兴讲话冷场尴尬
2019/08/08 职场文书
Python实现Excel文件的合并(以新冠疫情数据为例)
2022/03/20 Python
iOS 16进一步确认,一共支持16款iPhone
2022/04/28 数码科技