python图形化编程
一、pyside6图形化编程(不好打包)
1.1 spide6安装
视频教程:【python】快速上手GUI图形界面的编写(一)(使用pyside6,pyqt6,pyside2,pyqt5)_哔哩哔哩_bilibili
环境安装:
-
1、再pycharm中配置Designer
-
打开pycharm---新建工程
-
1、通过pycharm下面的Temirnal进行安装,因为只有通过这样安装,下载的pyside6才在当前目录下,安装pyside6模块
- pip3 install pyside6 注意:必须要在pycharm下面的Temirnal进行安装
-
2、打开setting---External Tools---点击右侧的加号 + --新建扩展工具
- Name填写:PySide6-Designer
- Description填写:PySide6-Designer
- Program:待下一步查询到该路径后再填写,先空着
- Arguments填写:$FileName$
- Working directory填写:$ProjectFileDir$
-
3、查询Program,在当前项目目录新建 main.py,如果main.py已经存在,就将其内容清空,填写下面的代码
-
import sys print(sys.executable) #结果为:C:\Users\painter\Desktop\python_gui\venv\Scripts\python.exe
-
-
4、填写Program:
- 再次根据步骤2找到扩展工具PySide6-Designer,编辑刚才的扩展工具,根据上一步的查询结果,在当前项目的venv\Scripts\ 目录下找到pyside6-designer.exe
-
-
2、配置PyUic
- 操作步骤和第一大步骤保持一致,不一样的内容为:
- Name填写:PyUic
- Description填写:PyUic
- Program:这次不需要查询,只需要在venv\Scripts\ 目录下找到pyside6-uic.exe
- Arguments填写:$FileName$ -o $FileNameWtihoutExtension$.py -x
- Working directory填写:$FileDir$
- 操作步骤和第一大步骤保持一致,不一样的内容为:
1.2 创建ui文件和编辑ui文件
创建流程:
- 在根目录--右键--New--File--main.ui
编辑ui文件
- 右键ui文件--External Tools--Designer--新建窗体
窗体Main Window和Widget的区别
- 这两个会影响后续的窗口绑定,选择的不同,绑定的代码有一些区别
1.3 ui和python的连接和转换
python连接ui的2种方式
- 方式一:不推荐
- 特点:需要多写一些代码
- 方式二:推荐
- 特点:直接通过ui里的一些控件的名字来连接,方便快捷
- 设置方法:ui界面---窗体---窗体设定----勾选 Connect slots by name
ui文件转换为python文件
- 右键ui文件---External Tools--PyUic
1.4 ui转python的缺点与解决方法
ui转换为python文件的缺点
- 在设计ui的时候,经常需要中途转换为python文件查看效果,然后再继续编辑ui文件,继续设计,然后再次转换为python文件进行测试,但是每次ui文件转换为python文件,都会将原有的python文件内容清空,这会导致我们前面设计的一些python代码都会被清空
解决方法:
- 假设我们test.ui 转换为的python文件为 test.py ,我们只需要再次新建一个main.py文件或者其他名字的python文件,然后在main.py里面创建类,让该类继承 test.py,这样无论test.py生成多少次,都不影响我们的最终代码 main.py
1.5 python图形化编程模板
模板:以后直接修改main.py文件即可
-
# @Time : 2021-12-01 18:49 # @Author : painter # @File : main.py # ! /usr/bin/env python # -*- coding: UTF-8 -*- import sys # widgets窗口需要的模板 from PySide6 import QtCore, QtWidgets from PySide6.QtCore import Slot #必须要有,否则后面无法使用这个装饰器 from test import Ui_Form class View(QtWidgets.QWidget, Ui_Form): # 这是多继承,因为多继承,所以将main入口里的代码进行了简化 def __init__(self): #初始化 super().__init__() # 这里也不能更改 self.setupUi(self) #自己建立自己的ui if __name__ == '__main__': # 这是模板,下面的几乎不用变动 QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling) app = QtWidgets.QApplication(sys.argv) # 下面这个是用来绑定widget窗口 window = QtWidgets.QWidget() view = View() # 实例化一个对象 # 下面的代码固定不动 view.show() sys.exit(app.exec())
1.6 ui和python动作的联动
意义:也就是当我们在ui上执行的一些操作,怎么在python里进行获取、修改
核心思想:
- 通过每个ui的控件的类名来实现
基本思路:
- 在我们的main里的view类里面创建函数来操作控件
易错点:
- 我们必须要通过装饰器来进行操作控件,也就是我们要在我们创建的每一个操作控件的函数上面加上:@Slot()
怎么获取每个控件拥有哪些信号(函数)?
- 在ui编辑界面---编辑---编辑信号槽--拖动控件到空白处,即可弹出该控件的各种信号
二、pyqt5图形化编程(推荐)
为什么要学pyqt5?
- 1、互联网上的资料更多
- 2、更好打包,用pyside6打包各种报错
1.1 环境配置
推荐使用环境:
- python3.8以及3.8以下,因为win7不支持python3.9
安装pyqt5和qt工具
- pip3 install PyQt5
- pip3 install pyqt5-tools
在pycharm里配置designer和PyUic
- 1、再pycharm中配置Designer
- 1、打开setting---External Tools---点击右侧的加号 + --新建扩展工具
- Name填写:pyqt5-Designer
- Description填写:pyqt5-Designer
- Program:D:\python\Python36\Lib\site-packages\qt5_applications\Qt\bin\designer.exe
- 可以用everying搜索designer.exe的路径
- Arguments填写:$FileName$
- Working directory填写:$ProjectFileDir$
- 2、在pycharm里配置PyUic
- 打开setting---External Tools---点击右侧的加号 + --新建扩展工具
- Name填写:PyUic
- Description填写:PyUic
- Program:D:\python\Python36\Scripts\pyuic5.exe
- 可以用everying搜索pyuic5.exe的路径
- Arguments填写:$FileName$ -o $FileNameWithoutExtension$.py -x
- Working directory填写:$FileDir$
- 打开setting---External Tools---点击右侧的加号 + --新建扩展工具
- 1、打开setting---External Tools---点击右侧的加号 + --新建扩展工具
1.2 基本语法与使用
基本语法:
-
运行入口函数:保持不变
-
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_())
-
让ui和python绑定
-
1、必须在类Ui_MainWindow下面的setupUi方法最下面进行添加代码
-
2、功能触发,比如点击按钮,会触发我们自定义的函数
-
self.pushButton.clicked.connect(self.clear_message) #点击按钮,会触发我们自定义的函数 clear_message,注意,clicked不能少,connect也不能少
-
-
3、核心:核心就是 self+ui里控件的类名+操作
-
4、完整代码示例:
-
from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(800, 600) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.pushButton = QtWidgets.QPushButton(self.centralwidget) self.pushButton.setGeometry(QtCore.QRect(260, 460, 121, 51)) self.pushButton.setObjectName("pushButton") self.label = QtWidgets.QLabel(self.centralwidget) self.label.setGeometry(QtCore.QRect(210, 80, 191, 51)) self.label.setObjectName("label") self.line = QtWidgets.QFrame(self.centralwidget) self.line.setGeometry(QtCore.QRect(0, 50, 611, 16)) self.line.setFrameShape(QtWidgets.QFrame.HLine) self.line.setFrameShadow(QtWidgets.QFrame.Sunken) self.line.setObjectName("line") self.line_2 = QtWidgets.QFrame(self.centralwidget) self.line_2.setGeometry(QtCore.QRect(0, 320, 611, 21)) self.line_2.setFrameShape(QtWidgets.QFrame.HLine) self.line_2.setFrameShadow(QtWidgets.QFrame.Sunken) self.line_2.setObjectName("line_2") self.line_3 = QtWidgets.QFrame(self.centralwidget) self.line_3.setGeometry(QtCore.QRect(10, 160, 611, 31)) self.line_3.setFrameShape(QtWidgets.QFrame.HLine) self.line_3.setFrameShadow(QtWidgets.QFrame.Sunken) self.line_3.setObjectName("line_3") self.textEdit = QtWidgets.QTextEdit(self.centralwidget) self.textEdit.setGeometry(QtCore.QRect(170, 200, 211, 111)) self.textEdit.setObjectName("textEdit") MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 23)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) #本行上面的代码都是自动生成的,无需管,下面的代码才是我们自己写的 self.pushButton.clicked.connect(self.clear_message) #将按钮pushButton和我们的定义的函数clear_message绑定起来,点击按钮就触发该函数 def clear_message(self): self.textEdit.clear() #清楚文本框的内容 def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.pushButton.setText(_translate("MainWindow", "PushButton")) self.label.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_())
-
选择文件功能
-
1、需要在ui设计界面添加 toolButton 按钮
-
2、需要在python代码里使用以下代码
-
self.toolButton.clicked.connect(self.select_file) def select_file(self): #文件选择框 self.filename = QtWidgets.QFileDialog.getOpenFileName()[0] self.filepath.setText(self.filename)
-
常用操作
-
获取文本框的内容
-
self.keyword.text() #这是lineEdit才能用text,另外一个好像需要toplane
-
-
修改文本框的内容
-
self.filepath.setText(self.filename)
-
-
清空文本框
-
self.keyword.clear()
-
1.3 项目实战一:post漏扫
完整代码:post漏扫项目
-
# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'test.ui' # # Created by: PyQt5 UI code generator 5.15.4 # # WARNING: Any manual changes made to this file will be lost when pyuic5 is # run again. Do not edit this file unless you know what you are doing. from PyQt5 import QtCore, QtGui, QtWidgets import requests,time,os class Ui_Form(object): def setupUi(self, Form): Form.setObjectName("Form") Form.resize(935, 692) self.postdata = QtWidgets.QLineEdit(Form) self.postdata.setGeometry(QtCore.QRect(640, 210, 281, 421)) self.postdata.setText("") self.postdata.setObjectName("postdata") self.pushButton = QtWidgets.QPushButton(Form) self.pushButton.setGeometry(QtCore.QRect(450, 510, 121, 41)) self.pushButton.setObjectName("pushButton") self.label = QtWidgets.QLabel(Form) self.label.setGeometry(QtCore.QRect(220, 0, 321, 51)) font = QtGui.QFont() font.setPointSize(20) font.setBold(True) self.label.setFont(font) self.label.setAlignment(QtCore.Qt.AlignCenter) self.label.setObjectName("label") self.label_2 = QtWidgets.QLabel(Form) self.label_2.setGeometry(QtCore.QRect(730, 30, 161, 21)) font = QtGui.QFont() font.setPointSize(13) font.setBold(True) font.setItalic(True) font.setUnderline(True) self.label_2.setFont(font) self.label_2.setObjectName("label_2") self.label_3 = QtWidgets.QLabel(Form) self.label_3.setGeometry(QtCore.QRect(70, 650, 801, 41)) font = QtGui.QFont() font.setBold(True) font.setUnderline(True) self.label_3.setFont(font) self.label_3.setScaledContents(False) self.label_3.setObjectName("label_3") self.label_4 = QtWidgets.QLabel(Form) self.label_4.setGeometry(QtCore.QRect(530, 330, 141, 41)) font = QtGui.QFont() font.setBold(True) self.label_4.setFont(font) self.label_4.setObjectName("label_4") self.label_5 = QtWidgets.QLabel(Form) self.label_5.setGeometry(QtCore.QRect(650, 150, 91, 21)) self.label_5.setObjectName("label_5") self.keyword = QtWidgets.QLineEdit(Form) self.keyword.setGeometry(QtCore.QRect(750, 150, 151, 21)) self.keyword.setObjectName("keyword") self.toolButton = QtWidgets.QToolButton(Form) self.toolButton.setGeometry(QtCore.QRect(860, 100, 41, 21)) self.toolButton.setObjectName("toolButton") self.filepath = QtWidgets.QLineEdit(Form) self.filepath.setGeometry(QtCore.QRect(640, 100, 211, 21)) self.filepath.setObjectName("filepath") self.label_6 = QtWidgets.QLabel(Form) self.label_6.setGeometry(QtCore.QRect(710, 80, 91, 21)) self.label_6.setObjectName("label_6") self.label_7 = QtWidgets.QLabel(Form) self.label_7.setGeometry(QtCore.QRect(130, 80, 91, 31)) font = QtGui.QFont() font.setBold(True) self.label_7.setFont(font) self.label_7.setObjectName("label_7") self.textBrowser = QtWidgets.QTextBrowser(Form) self.textBrowser.setGeometry(QtCore.QRect(30, 150, 361, 461)) self.textBrowser.setObjectName("textBrowser") self.clearButton = QtWidgets.QPushButton(Form) self.clearButton.setGeometry(QtCore.QRect(460, 400, 91, 41)) self.clearButton.setObjectName("clearButton") self.retranslateUi(Form) QtCore.QMetaObject.connectSlotsByName(Form) #下面的都是自己写的代码 self.toolButton.clicked.connect(self.select_file) #连接toolButton self.clearButton.clicked.connect(self.message_clear) #连接clearButton,触发清空函数 self.pushButton.clicked.connect(self.main) def select_file(self): #文件选择框 self.filename = QtWidgets.QFileDialog.getOpenFileName()[0] self.filepath.setText(self.filename) #将文本框的内容设置为刚刚获取到的文件路径 def message_clear(self): self.postdata.clear() #清空按钮 self.keyword.clear() # 清空按钮 self.textBrowser.clear() def main(self): self.pushButton.setEnabled(False) #点击一次之后禁用按钮 with open(self.filename, 'r', encoding="utf-8") as f: temp = f.readlines() for host in temp: self.ip = host.strip() self.run(self.postdata.text(), self.ip, self.keyword.text()) #self.postdata.text()是获取到的post文本框的内容,self.keyword.text()是关键字文本框那里获取到的内容 self.pushButton.setEnabled(True) # 全部检测完之后启用按钮 def run(self,temp, u, keyword): headers = {} print("类型为:application/x-www-form-urlencoded") host = u.strip("http://").strip("https://") header, data = self.split_data(temp,host) # 获取请求的url,请求头(host已经替换为空),post的data payload = u + self.url_dic # 漏洞地址 if "application/json" in str(header): # 查看当前数据包的编码类型,方便后续对headers进行删除部分数据,因为有时候必须要删除某些数据才能正常 content_type = "application/json" elif "multipart/form-data" in str(header): content_type = "multipart/form-data" else: content_type = "application/x-www-form-urlencoded" for m in header: position = m.find(":") # 第一个冒号出现的位置 key = m[0:position] value = m[position:].strip(":").strip() # 去除多余的空格,去除分割多余的冒号, headers.update({"{}".format(key): "{}".format(value)}) # 将处理好的数据储存到headers里去 self.post_message(payload, headers, data, keyword, content_type) def split_data(self,message, host): # 用来取出请求头、请求体,以及目标 后面拼接的url header = [] # 储存请求头 data = [] # 储存请求体 message = str(message).split("\n") position = message.index("") # 查找第一个空行,这就是请求头和请求体的分割位置 msg1 = message[0:position] # 请求头的数据,未处理 msg2 = message[position + 1:] # 请求体的数据,未处理 print(message) for line1 in msg1: if line1.startswith("POST"): url_dic = line1.strip("POST") url_dic = url_dic.replace("HTTP/1.0", '') url_dic = url_dic.replace("HTTP/1.1", '') url_dic = url_dic.replace("HTTP/2.0", '') self.url_dic = url_dic.strip() # 这是目标后面的网址url continue else: header.append(line1.strip()) for line2 in msg2: data.append(line2) # 这个不需要去除换行,因为请求体里有的有空行 return header, data def post_message(self,payload_url, headers, data, keyword, content_type): data = str(data).strip("[").strip("]").strip("'") # 提取data,去掉多余的字符 if content_type == "application/json": res = requests.post(url=payload_url, headers=headers, json=data) # 这里的post的参数是json if keyword in res: print("存在漏洞:{}".format(url)) self.textBrowser.append(payload_url) self.write_result(url) elif content_type == "multipart/form-data": h = headers h.pop("Content-Type") # 必须要删除,python会自动添加,否则会冲突 files = {'file': open('1.txt', 'rb')} res = requests.post(url=payload_url, headers=h, files=files).content.decode("utf-8") if keyword in res: print("存在漏洞:{}".format(payload_url)) self.textBrowser.append(payload_url) self.write_result(payload_url) else: res = requests.post(url=payload_url, headers=headers, data=data).content.decode("utf-8") # res = requests.post(url=url,headers=h,data=data, proxies=proxies).content.decode("utf-8") if keyword in res: print("存在漏洞:{}".format(payload_url)) self.textBrowser.append(payload_url) self.write_result(payload_url) def write_result(self,result_url): with open("vul_result.txt", "a+", encoding="utf-8") as f: f.write(result_url + '\n') def retranslateUi(self, Form): _translate = QtCore.QCoreApplication.translate Form.setWindowTitle(_translate("Form", "Form")) self.pushButton.setText(_translate("Form", "开始检测")) self.label.setText(_translate("Form", "post请求提交器")) self.label_2.setText(_translate("Form", "author: painter")) self.label_3.setText(_translate("Form", "功能:将post数据包直接粘贴到这里,然后选择目标txt,提交命中漏洞的关键字,最后点击开始检测,最终的结果会保存至vul_result.txt目录下")) self.label_4.setText(_translate("Form", "post数据包粘贴处")) self.label_5.setText(_translate("Form", "漏洞触发关键字:")) self.toolButton.setText(_translate("Form", "open")) self.label_6.setText(_translate("Form", "选择目标文件")) self.label_7.setText(_translate("Form", "漏洞结果")) self.clearButton.setText(_translate("Form", "清空结果")) if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) Form = QtWidgets.QWidget() ui = Ui_Form() ui.setupUi(Form) Form.show() sys.exit(app.exec_())
1.4 项目实战二:撩骚机器人
完整代码:
-
# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'test.ui' # # Created by: PyQt5 UI code generator 5.15.4 # # WARNING: Any manual changes made to this file will be lost when pyuic5 is # run again. Do not edit this file unless you know what you are doing. from PyQt5 import QtCore, QtGui, QtWidgets import requests class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(864, 697) font = QtGui.QFont() font.setFamily("Agency FB") font.setStyleStrategy(QtGui.QFont.PreferDefault) MainWindow.setFont(font) MainWindow.setContextMenuPolicy(QtCore.Qt.PreventContextMenu) MainWindow.setStyleSheet("") self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.label = QtWidgets.QLabel(self.centralwidget) self.label.setGeometry(QtCore.QRect(230, -10, 271, 91)) self.label.setObjectName("label") self.line_5 = QtWidgets.QFrame(self.centralwidget) self.line_5.setGeometry(QtCore.QRect(140, 530, 81, 20)) self.line_5.setFrameShape(QtWidgets.QFrame.HLine) self.line_5.setFrameShadow(QtWidgets.QFrame.Sunken) self.line_5.setObjectName("line_5") self.label_2 = QtWidgets.QLabel(self.centralwidget) self.label_2.setGeometry(QtCore.QRect(140, 490, 91, 41)) self.label_2.setStyleSheet("\n" "background-color:rgb(240, 240, 240);") self.label_2.setObjectName("label_2") self.lineEdit = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit.setGeometry(QtCore.QRect(220, 480, 271, 61)) self.lineEdit.setObjectName("lineEdit") self.pushButton = QtWidgets.QPushButton(self.centralwidget) self.pushButton.setGeometry(QtCore.QRect(490, 480, 71, 61)) font = QtGui.QFont() font.setFamily("SimSun") font.setPointSize(20) font.setBold(True) font.setWeight(75) font.setStyleStrategy(QtGui.QFont.NoAntialias) self.pushButton.setFont(font) self.pushButton.setStyleSheet("background-color: rgb(255, 85, 0);") self.pushButton.setObjectName("pushButton") self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget) self.textBrowser.setGeometry(QtCore.QRect(140, 110, 421, 371)) self.textBrowser.setStyleSheet("") self.textBrowser.setObjectName("textBrowser") self.line = QtWidgets.QFrame(self.centralwidget) self.line.setGeometry(QtCore.QRect(140, 480, 3, 61)) self.line.setFrameShape(QtWidgets.QFrame.VLine) self.line.setFrameShadow(QtWidgets.QFrame.Sunken) self.line.setObjectName("line") self.label_3 = QtWidgets.QLabel(self.centralwidget) self.label_3.setGeometry(QtCore.QRect(600, 180, 261, 131)) self.label_3.setObjectName("label_3") self.label_4 = QtWidgets.QLabel(self.centralwidget) self.label_4.setGeometry(QtCore.QRect(650, 430, 161, 51)) self.label_4.setObjectName("label_4") MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 864, 21)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) self.pushButton.clicked.connect(self.get_response) self.pushButton.clicked.connect(self.lineEdit.clear) def get_response(self): self.textBrowser.clear() query = self.lineEdit.text() # 获取提交查询的内容 print(query) print("盘他:") url = 'http://app.lihsk.com/lihsk/android/paster/getPasterByTitle.html' data = { 'name': query, 'pageNumber': '1', 'pageSize': '10' } html = requests.post(url=url, data=data).json() if (html['count'] == 0): print("未查询到数据!") self.textBrowser.setText("未查询到数据。。。") return else : for i in html['list']: print(i['content']) self.textBrowser.append(i['content']) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "撩骚机器人 ---painter")) self.label.setText(_translate("MainWindow", "<html><head/><body><p><span style=\" font-size:48pt; font-weight:600; color:#ff5500; vertical-align:sub;\">撩骚机器人</span></p></body></html>")) self.label_2.setText(_translate("MainWindow", "<html><head/><body><p><span style=\" font-size:24pt; color:#000000;\">输入:</span></p></body></html>")) self.pushButton.setText(_translate("MainWindow", "发送")) self.label_3.setText(_translate("MainWindow", "<html><head/><body><p><span style=\" font-size:18pt;\"/><span style=\" font-size:18pt; font-weight:600;\"> 注意事项:</span></p><p><span style=\" font-size:14pt;\">需要联网查询数据库,</span></p><p><span style=\" font-size:14pt;\">所以需要等待几秒钟</span></p></body></html>")) self.label_4.setText(_translate("MainWindow", "<html><head/><body><p><span style=\" font-size:18pt; font-weight:600; color:#ff0000;\">author:painter</span></p></body></html>")) 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_())
1.5 打包成exe
推荐环境:
- python3.8及其以下
推荐工具:auto-py-to-exe
- 安装:pip36 install auto-py-to-exe
- 启动: auto-py-to-exe
- 基本功能:
- 1、打包成一个目录
- 2、打包成一个exe
- 3、可以设置图标
- 4、其他功能都有,这是图形化界面