找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 9658|回复: 0

[代码与实例] 使用PyQt开发 火车票查询软件

50

主题

1057

帖子

1108

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1108

活跃会员热心会员最佳导师默默耕耘突出贡献优秀版主荣誉管理论坛元老

blueelwang 发表于 2014-1-6 15:39:19 | 显示全部楼层 |阅读模式
开发环境:Python3.3.3,PyQt5.1.1
注意:Python版本

  1. # -*- coding: utf-8 -*-
  2. # Python 3.3.3
  3. # PyQt 5.1.1
  4. import sys,time,re,urllib.parse,urllib.request,http.cookiejar,json
  5. from PyQt5.QtCore import *
  6. from PyQt5.QtGui import *
  7. from PyQt5.QtWidgets import *

  8. """cookie"""
  9. cookie=http.cookiejar.LWPCookieJar()
  10. #cookie.load('f:/cookie.txt',True,True)
  11. chandle=urllib.request.HTTPCookieProcessor(cookie)

  12. """获取数据"""
  13. def getData(url):
  14.     r=urllib.request.Request(url)
  15.     opener=urllib.request.build_opener(chandle)
  16.     u=opener.open(r)
  17.     #chandle.cookiejar.save('f:/cookie.txt',True,True)
  18.     data=u.read()
  19.     try:
  20.         data=data.decode('utf-8')
  21.     except:
  22.         data=data.decode('gbk','ignore')
  23.     return data
  24. def postData(url,data):
  25.     data=urllib.parse.urlencode(data);data=bytes(data,'utf-8')
  26.     r=urllib.request.Request(url,data)
  27.     opener=urllib.request.build_opener(chandle)
  28.     u=opener.open(r)
  29.     #chandle.cookiejar.save('f:/cookie.txt',True,True)
  30.     data=u.read()
  31.     try:
  32.         data=data.decode('utf-8')
  33.     except:
  34.         data=data.decode('gbk','ignore')
  35.     return data
  36. """火车票"""
  37. class Ticket:
  38.     def init(self,s,e,d):
  39.         self.li=[]
  40.         cont=getData('https://kyfw.12306.cn/otn/resources/js/framework/station_name.js')
  41.         s=re.findall('%s\|([^|]+)' % s,cont)[0]
  42.         e=re.findall('%s\|([^|]+)' % e,cont)[0]
  43.         url='https://kyfw.12306.cn/otn/lcxxcx/query?purpose_codes=0X00&queryDate=%s&from_station=%s&to_station=%s' % (d,s,e)
  44.         cont=json.loads(getData(url))["data"]["datas"]
  45.         name=[
  46.             "station_train_code",
  47.             "from_station_name",
  48.             "to_station_name",
  49.             "lishi",
  50.             "swz_num",
  51.             "tz_num",
  52.             "zy_num",
  53.             "ze_num",
  54.             "gr_num",
  55.             "rw_num",
  56.             "yw_num",
  57.             "rz_num",
  58.             "yz_num",
  59.             "wz_num",
  60.             "qt_num"
  61.         ]
  62.         for x in cont:
  63.             tmp=[]
  64.             for y in name:
  65.                 if y=="from_station_name":
  66.                     s=x[y]+'\n'+x["start_time"]
  67.                     tmp.append(s)
  68.                 elif y=="to_station_name":
  69.                     s=x[y]+'\n'+x["arrive_time"]
  70.                     tmp.append(s)
  71.                 else:
  72.                     tmp.append(x[y])
  73.             self.li.append(tmp)
  74. """ui"""
  75. class Dialog(QDialog):
  76.     ticket=Ticket()
  77.     def __init__(self):
  78.         super().__init__()
  79.         self.resize(750,350)
  80.         #布局管理器
  81.         self.layout=[QVBoxLayout(self),QHBoxLayout()]
  82.         self.layout[1].setContentsMargins(0,0,0,0)
  83.         self.layout[1].setSpacing(0)
  84.         self.layout[0].setContentsMargins(0,0,0,0)
  85.         self.layout[0].setSpacing(0)
  86.         self.layout[0].addLayout(self.layout[1])
  87.         #按钮
  88.         btn=QPushButton("ok")
  89.         btn.clicked.connect(self.submit)
  90.         #输入选项
  91.         label=[QLabel("发站:"),QLabel("到站:"),QLabel("日期:")]
  92.         self.line=[QLineEdit(),QLineEdit(),QComboBox()]
  93.         y=int(time.strftime("%Y",time.localtime()))
  94.         m=int(time.strftime("%m",time.localtime()))
  95.         d=int(time.strftime("%d",time.localtime()))
  96.         i=0
  97.         yy=y
  98.         mm=m
  99.         dd=d
  100.         while i<20:
  101.             if m in (1,3,5,7,8,10,12):
  102.                 if d+i>31:
  103.                     dd=d+i-31
  104.                     mm=m+1
  105.                     if mm>12:
  106.                         yy=y+1
  107.                         mm=mm-12
  108.                 else:
  109.                     dd=d+i
  110.             elif m in (4,6,9,11):
  111.                 if d+i>30:
  112.                     dd=d+i-30
  113.                     mm=m+1
  114.                     if mm>12:
  115.                         yy=y+1
  116.                         mm=mm-12
  117.                 else:
  118.                     dd=d+i
  119.             else:
  120.                 if (m%400==0) or ((m%4==0) and (m%100!=0)):
  121.                     if d+i>29:
  122.                         dd=d+i-29
  123.                         mm=m+1
  124.                         if mm>12:
  125.                             yy=y+1
  126.                             mm=mm-12
  127.                     else:
  128.                         dd=d+i
  129.                 else:
  130.                     if d+i>28:
  131.                         dd=d+i-28
  132.                         mm=m+1
  133.                         if mm>12:
  134.                             yy=y+1
  135.                             mm=mm-12
  136.                     else:
  137.                         dd=d+i
  138.             s='%d-%02d-%02d' % (yy,mm,dd)
  139.             self.line[2].addItem(s)
  140.             i+=1
  141.         i=0
  142.         while i<3:
  143.             self.line[i].setMaximumWidth(100)
  144.             label[i].setMaximumWidth(50)
  145.             label[i].setAlignment(Qt.AlignRight|Qt.AlignVCenter)
  146.             self.layout[1].addWidget(label[i],Qt.AlignRight)
  147.             self.layout[1].addWidget(self.line[i],Qt.AlignLeft)
  148.             i+=1
  149.         self.layout[1].addWidget(btn)
  150.         #表格
  151.         head=['车次','发站','到站','历时','商务座','特等座','一等座','二等座','高级软卧','软卧','硬卧','软座','硬座','无座','其他']
  152.         self.table=QTableWidget()
  153.         self.table.setEditTriggers(QAbstractItemView.NoEditTriggers)
  154.         self.table.setColumnCount(15)
  155.         self.table.setHorizontalHeaderLabels(head)
  156.         self.layout[0].addWidget(self.table)
  157.         self.show()
  158.     def submit(self):
  159.         self.table.clearContents()
  160.         s=self.line[0].text()
  161.         e=self.line[1].text()
  162.         d=self.line[2].currentText()
  163.         self.ticket.init(s,e,d)
  164.         self.table.setRowCount(len(self.ticket.li))
  165.         i=0
  166.         for x in self.ticket.li:
  167.             j=0
  168.             for y in x:
  169.                 if j==1 or j==2:
  170.                     item=QLabel(y)
  171.                     item.setAlignment(Qt.AlignCenter)
  172.                     self.table.setCellWidget(i,j,item)
  173.                 else:
  174.                     item=QTableWidgetItem(y)
  175.                     item.setTextAlignment(Qt.AlignCenter)
  176.                     if not re.search('\D',y):
  177.                         item.setForeground(QBrush(Qt.red))
  178.                     self.table.setItem(i,j,item)
  179.                 if j>2 or j==0:
  180.                     self.table.resizeColumnToContents(j)
  181.                 j+=1
  182.             i+=1
  183. if __name__=="__main__":
  184.     app=QApplication(sys.argv)
  185.     dialog=Dialog()
  186.     sys.exit(app.exec_())
复制代码




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表