一、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、其他功能都有,這是圖形化界面