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