pyqt5+requests实现一个车票查询工具,供大家参考,具体内容如下
结构图
效果图
思路
1、search(qpushbutton)点击信号(clicked)连接到自定义的槽函数(event.search)
2、槽函数(event.search)接收四个参数:qtablewidget对象的引用、两个qlabel中的内容(站台名称)、qdateedit格式化日期
3、槽函数(event.search)调用爬虫类(trainservice)获取车次信息,添加到qtablewidget对象中。
代码
1、ui.py(ui界面)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
# -*- 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(自定义槽函数类)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#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(爬虫类)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
#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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/weixin_38283159/article/details/86490978