pycharm+pyqt5+pyinstaller实现可视化界面

1、安装软件和模块pycharm+pyqt5+pyqt5-tool+pyinstaller,以及相关配置
2、在QT中创建界面,生成ui文件
注:使用帮助文档,按一次“F1”即可全屏显示帮助文档页面,按“Esc”即可退出。
3、通过pyuic5 -o Interface.py Interface.ui,将ui文件转为py文件。
4、调用,新建RecallInterface.py,以及自己主函数f1.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
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
118
119
import sys
#PyQt5中使用的基本控件都在PyQt5.QtWidgets模块中
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtWidgets import QFileDialog
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import threading
#导入designer工具生成的Interface.py
from XXA import Ui_MainWindow
#导入自己设计的信息函数
from f1 import NewoneEVE

class RecallInterface (QMainWindow, Ui_MainWindow):
#初始化,定义添加信息槽
def __init__(self, parent=None):
super(RecallInterface, self).__init__(parent)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
#初始化界面信息
self.init_login_info()
#触发事件
self.ui.OK.clicked.connect(self.begin)
self.ui.Reset.clicked.connect(self.clearResult)
self.ui.openfile.clicked.connect(self.msge)
self.url = "https://www.baidu.com/index.php?tn=monline_3_dg"
self.ui.pushButton.clicked.connect(self.msg)

# 保存登录信息
def save_login_info(self):
settings = QSettings("config.ini", QSettings.IniFormat) # 方法1:使用配置文件
# settings = QSettings("mysoft","myapp") #方法2:使用注册表
settings.setValue("excelpath", self.ui.excelpath.text())
settings.setValue("readsheetname", self.ui.readsheetname.text())
settings.setValue("browser", self.ui.browser.currentText())
settings.setValue("driver_path", self.ui.driver_path.text())
settings.setValue("startnum", self.ui.startnum.text())
settings.setValue("rownum", self.ui.row.text())
settings.setValue("endnum", self.ui.endnum.text())
settings.setValue("sleeptime", self.ui.sleeptime.text())
settings.setValue("topage", self.ui.topage.text())
settings.setValue("toline", self.ui.toline.text())
settings.setValue("need_domain", self.ui.need_domain.currentText())
#初始化界面信息
def init_login_info(self):
settings = QSettings("config.ini", QSettings.IniFormat) #方法1:使用配置文件
#settings = QSettings("mysoft","myapp") #方法2:使用注册表
excelpath =settings.value("excelpath")
readsheetname = settings.value("readsheetname")
browser = settings.value("browser")
driver_path = settings.value("driver_path")
startnum = settings.value("startnum")
endnum= settings.value("endnum")
rownum = settings.value("rownum")
sleeptime = settings.value("sleeptime")
topage = settings.value("topage")
toline = settings.value("toline")
need_domain = settings.value("need_domain")
########
self.ui.excelpath.setText(excelpath)
self.ui.readsheetname.setText(readsheetname)
self.ui.browser.setCurrentText(browser)
self.ui.driver_path.setText(driver_path)
self.ui.startnum.setText(startnum)
self.ui.endnum.setText(endnum)
self.ui.row.setText(rownum)
self.ui.sleeptime.setText(sleeptime)
self.ui.topage.setText(topage)
self.ui.toline.setText(toline)
self.ui.need_domain.setCurrentText(need_domain)
#打开文件
def msge(self):
# directory1 = QFileDialog.getExistingDirectory(self,"选取文件夹","./") #起始路径
fileName1, filetype1 = QFileDialog.getOpenFileName(self, "选取文件", "./",
"All Files (*)") # 设置文件扩展名过滤,注意用双分号间隔
self.ui.excelpath.setText(fileName1)
def msg(self):
fileName2, filetype2 = QFileDialog.getOpenFileName(self, "选取文件", "./",
"All Files (*)") # 设置文件扩展名过滤,注意用双分号间隔
self.ui.driver_path.setText(fileName2)

def clearResult(self):
self.ui.excelpath.clear()
self.ui.readsheetname.clear()
self.ui.driver_path.clear()
self.ui.startnum.clear()
self.ui.endnum.clear()
self.ui.sleeptime.clear()
self.ui.topage.clear()
self.ui.toline.clear()
self.ui.output.clear()
def begin(self):
#保存配置
self.save_login_info()
startnum = int(self.ui.startnum.text())
endnum = int(self.ui.endnum.text())
rownum = int(self.ui.row.text())
excelpath = self.ui.excelpath.text()
readsheetname = self.ui.readsheetname.text()
sleeptime = int(self.ui.sleeptime.text())
browser = self.ui.browser.currentText()
driver_path = self.ui.driver_path.text()
topage = int(self.ui.topage.text())
toline = int(self.ui.toline.text())
need_domain=self.ui.need_domain.currentText()
# 第3/3
#调用主程序,New0111.py文件中NewoneEVE函数,并将返回值显示在界面上
ndomin,npage,nline,mainbody=NewoneEVE(startnum, endnum, rownum, excelpath, readsheetname, sleeptime, browser,driver_path, topage, toline, need_domain)
self.ui.output.setText('当前信息:'+str(ndomin)+" "+str(mainbody)+" "+'当前页【'+ str(npage)+ '】;当前行【'+ str(nline)+ '】')

if __name__ == "__main__":
#固定的,PyQt5程序都需要QApplication对象。sys.argv是命令行参数列表,确保程序可以双击运行
app = QApplication(sys.argv)
#初始化
myWin = RecallInterface()
#将窗口控件显示在屏幕上
myWin.show()
#程序运行,sys.exit方法确保程序完整退出。
sys.exit(app.exec_())

5、为实验代码的可迁移性,使用命令行将文件打包生成exe文件。命令成功运行后,将会在项目目录中看到build文件夹和dist文件夹,把dist文件夹中的文件打包给第三方使用即可。
(1) 需要了解pyinstaller相关参数以及使用的格式pyinstaller文档

1
pyinstaller -F -w RecallInterface.py
1
pyinstaller -F -w RecallInterface.py -i Documents.ico
1
pyinstaller -D RecallInterface.py Interface.py f1.py
 常见的用法
 -F:dist文件下只有exe文件,把所有东西打包成一个exe文件,结构简单,启动慢。
 -D(默认):dist文件下有exe文件以及依赖的附件,打包成多个文件,结构复杂,启动快。
 -w:没有命令行窗口
 -i:exe文件的图标

(2)多个文件打包

  • 命令行打包
1
2
#RecallInterface.py,Interface.py, f1.py在同一目录下,默认是以-D形式打包
pyinstaller RecallInterface.py Interface.py, f1.py
1
pyinstaller RecallInterface.py -p C:/Interface.py, -p C:/f1.py

注:到切换到主文件路径下执行命令,不然要写RecallInterface.py,Interface.py, f1.py的完整路径。

  • pyi-makespec打包
    1
    pyi-makespec RecallInterface.py
    修改.spec文件spec文档
    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
    # -*- mode: python ; coding: utf-8 -*-

    block_cipher = None


    a = Analysis(['RecallInterface.py', 'Interface.py', 'f1.py'],
    pathex=['C:\\pythonProject\\crawer'],
    binaries=[],
    datas=[],
    #此处可以添加静态资源,例如你有个图片文件夹imgs,可以这样写[('imgs','imgs'),('test.txt','.')],打包以后会有一个一样的文件夹,点表示当前文件夹。
    hiddenimports=[],
    hookspath=[],
    runtime_hooks=[],
    excludes=[],
    win_no_prefer_redirects=False,
    win_private_assemblies=False,
    cipher=block_cipher,
    noarchive=False)
    pyz = PYZ(a.pure, a.zipped_data,
    cipher=block_cipher)
    exe = EXE(pyz,
    a.scripts,
    a.binaries,
    a.zipfiles,
    a.datas,
    [],
    name='RecallInterface',
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,# 打包的时候进行压缩,False表示不压缩
    upx_exclude=[],# 是否显示黑窗口,刚开始打包的时候一般都会有问题,建议设为True,解决所有问题后可以设置为False)
    runtime_tmpdir=None,
    console=True )

    执行命令
    1
    pyinstaller RecallInterface.spec