最近工作需要,"小吴,用pyqt做一个下载界面程序,然后打包好exe给我看看。"
作为一个刚入行不久的小萌新,还没有使用过pyqt,于是在网上各种搜索,好在终于做出了简单的界面,
以下说说怎么做的,方便日后查看。
1、PyQt安装
一开始想安装 pyqt5 来着,使用 pip install python-qt5 安装,安装完毕之后,导入模块发生报错
发现 本人使用的是python2.7 32位的,而安装的这个pyqt5是64位的,公司用的都是python2.7的,于是改用pyqt4。
pyqt4的安装可以参考这个地址 https://blog.csdn.net/wlanye/article/details/83855668
2、程序代码
#coding=utf-8
import sys
import os
from PyQt4 import QtGui,QtCore
# from PyQt5 import QtWidgets
from openpyxl import load_workbook
import requests,json
import urllib
class Example(QtGui.QWidget):
def __init__(self):
super(Example, self).__init__()
self.initUI()
def initUI(self):
self.setGeometry(500, 300, 500, 300) # 前面两个 参数 是窗口的 x,y 坐标 后面两个是 窗口的宽高
self.setWindowIcon(QtGui.QIcon("title.png")) # 设置窗口 的 图标
self.setWindowTitle(u"XXXX下载器") # 设置窗口的 标题
# self.resize(300, 200) # 这个方法也是 调整 窗口的大小
# 文本 label
#存储路径
path = QtGui.QLabel(u"存储路径")
# 使用说明
readme = QtGui.QLabel(u"使用说明:")
self.readmeEdit = QtGui.QTextEdit() # 多行文本域
self.readmeEdit.setPlainText(u"1、点击'...'选择存储路径, 当然也可以不用选择!")
self.readmeEdit.append(u"2、点击'下载'开始导出数据!")
self.readmeEdit.append(u"3、点击'取消'将关闭程序窗口!")
# text_name = QtGui.QLabel(u"文件名")
# 文本框
self.pathEdit = QtGui.QLineEdit()
self.pathEdit.setText("C:/csv/zdzx/export.xlsx") # 文件默认的路径
self.btn = QtGui.QPushButton("...") #这个要绑定事件的 用户进行路径选择
self.determineBtn = QtGui.QPushButton()
self.determineBtn.setText(u"下载") # 下载事件
self.cancleBtn = QtGui.QPushButton(u"取消") # 关闭程序窗口
# btn 绑定事件
# self.text_nameEdit.textChanged[str].connect(self.onChanged)
self.btn.clicked.connect(self.filepath)
self.determineBtn.clicked.connect(self.export_excel)
self.cancleBtn.clicked.connect(self.quit)
#进行布局 网格化布局
grid = QtGui.QGridLayout()
grid.addWidget(path,1,0)
grid.addWidget(self.pathEdit,1,1)
grid.addWidget(self.btn,1,2)
grid.addWidget(readme,2,0)
grid.addWidget(self.readmeEdit,2,1)
grid.addWidget(self.determineBtn,3,2)
grid.addWidget(self.cancleBtn,3,3)
self.setLayout(grid)
# 路径选择事件函数
def filepath(self):
# file_path = QtGui.QFileDialog.getExistingDirectory()# 选择文件夹
file_path = QtGui.QFileDialog.getSaveFileName(self,'save file',"export" ,".xlsx")## 文件选择框名称, 文件名称, 文件类型格式
# print file_path
if file_path:
self.pathEdit.setText(file_path) # 改变 路径
else:
self.pathEdit.setText("C:/csv/zdzx/export.xlsx")
# 文件下载 事件
def export_excel(self):
try:
# 获取文件 路径
# 首先就来 判断文件的 类型 ,只能是 xlsx 格式的
# 此时在判断 文件的完整路径是否存在 ,不存在就报错 , 路径存在 ,文件名存在就删除 重新创建
filename = self.pathEdit.text() #获取 文本框中 文件名
##filename 是一个 QtCore.QString 的 字符串 , 后续的处理 需要进行编码转换
filename = unicode(QtCore.QString(filename))
path_list = filename.split("/")
path = "/".join(path_list[:-1])
if os.path.exists(path): #文件夹存在
if os.path.exists(filename): #文件是否存在 存在删除文件
os.remove(filename) #删除文件
else: # 文件夹不存在呢
os.makedirs(path)
print os.path.exists(path)
# 发送请求 获取数据
getData = sys.argv[1] ##接收前端 传递 过来的 参数
para = getData.replace("hsycprint:","")#这个时候 para 是一个 url 的编码
para = urllib.unquote(para) # 将url 编码转换为 字符串
para = json.loads(para)
res = requests.post("http://172.25.10.187:8000/BdMonitor/zdzxApi", json=para)
resData = json.loads(res.text)
list_data = resData.get('list')
# xlsFilename = list_data[0].get("fileNameAndPath")
exceldata = list_data[0].get("fileData")
self.writeDataToCsv(filename, exceldata)
except Exception,e:
#发生报错了 就 将 报错信息写入 多行文本域
self.readmeEdit.setPlainText(str(e))
# 将 列表 数据 写入 excel 文件 参数: 文件路径 , 数据 列表
def writeDataToCsv(self,xlsFilename, demoExcelData):
try:
print u"进入写入 excel"
wb = load_workbook(filename = "D:\\pythonWorkSpace\\HSYC_UI01\\bnd01\\zdzx_test.xlsx")
sheets = wb.get_sheet_names()
ws = wb.get_sheet_by_name(sheets[0]) # 获取第一张表
for row_data in demoExcelData: # 行
# 获取当前行
i = demoExcelData.index(row_data)
for j in range(1, len(row_data)+1): # 列
ws.cell(row=i+3, column=j).value = demoExcelData[i][j-1]
wb.save(xlsFilename)
except Exception, e:
#发生报错了 就将 报错信息写入 多行文本域
self.readmeEdit.setPlainText(str(e))
# appLogger.exception(e)
# 程序退出
def quit(self):
self.close()
def main_ui():
app = QtGui.QApplication(sys.argv) #创建应用对象
ex = Example()# 创建实例化对象
ex.show() # 显示
sys.exit(app.exec_())#程序主循环 直至窗口关闭或程序终止
if __name__ == "__main__":
main_ui()
3、pyinstaller打包
直接运行以下命令:
pyinstaller -F -w -i hhh.ico qt4_donwload.py
-F 表示生成单个可执行文件
-w 表示去掉控制台窗口,这在GUI界面时非常有用
-i 表示可执行文件的图标 ,后面跟 .ico 的图标名
打包生成的 exe文件在 dist文件夹中, 移动 exe文件的位置之后 会显示应用的图标
界面窗口的图标 ‘title.png’ 最好放在和exe文件相同路径下才会显示。