關注、星標公眾號,直達精彩內容
來源:CSDN
作者:Erics-1996
以下文章來源於CSDN,作者是Erics-1996,個人覺得寫得不錯分享給大家。這篇文章主要介紹了詳解Python GUI編程之PyQt5入門到實戰,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
文章目錄1. PyQt5基礎
2. QtDesigner的使用
3. PyQt5核心API的使用
4. PyQt5中常用控制項API的使用
1.1 GUI編程學什麼
1.2 PyQT是什麼
1.3 PyQT的優勢
1.4 開發環境的安裝
1.5 第一個pyqt5桌面應用
2.1 安裝和配置
2.2 快速入門
2.3 將ui文件轉換成py文件
2.4 水平布局
2.5 垂直布局
2.6 同時使用水平布局和垂直布局
2.7 柵格布局
2.8 表單布局
2.9 容器布局
2.10 絕對布局
2.11 布局中的間隔和分割線
2.12 控制項最大尺寸和最小尺寸
2.13 尺寸策略
2.14 設置控制項之間的夥伴關係
2.15 修改控制項的Tab順序
2.16 信號與槽的設置
2.17 添加菜單和工具欄
3.1 創建主窗口
3.2 主窗口居中顯示
3.3 退出應用程式
3.4 屏幕坐標系
3.5 設置窗口和應用程式圖標
3.6 控制項添加提示消息
4.1 QLabel控制項的基本用法
4.2 QLabel與夥伴控制項
4.3 QLineEdit控制項與回顯模式
4.4 QLineEdit控制項的校驗器
4.5 使用掩碼限制QLineEdit控制項的輸入
4.6 QLineEdit控制項綜合案例
1. PyQt5基礎1.1 GUI編程學什麼1.2 PyQT是什麼QT是跨平臺C++庫的集合,它實現高級API來訪問現代桌面和移動系統的許多方面。這些服務包括定位和定位服務、多媒體、NFC和藍牙連接、基於Chromium的web瀏覽器以及傳統的UI開發。PyQt5是Qt v5的一組完整的Python綁定。它被實現為超過35個擴展模塊,並使Python在所有支持的平臺(包括IOS和Android)上被用作C++的替代應用程式開發語言。PyQT5也可以嵌入在基於C++的應用程式中,以允許這些應用程式的用戶配置或增強這些應用程式的功能。
1.3 PyQT的優勢簡單好用
功能強大
跨平臺支持
性能高
文檔齊全:PyQT本身就是對QT庫Python的綁定,在綁定的時候保持了原有的QT庫的API。也就是說,PyQT除了自己的文檔外,也幾乎可以通用QT文檔。
穩定性高:面向對象、信號與槽的機制、界面設計與業務代碼完全隔離
生態支持:QU Designer進行圖形界面設計、ui轉換成py文件、資源處理
開源免費:PyQT是雙重許可的,開發人員可以在GPL和商業許可之間進行選擇。採用GPL協議,軟體著作權屬於開發者本人所有,受國際相關版權法保護,允許其他用戶對原作者軟體進行複製和發行,也可以更改後髮型自己的軟體。
1.4 開發環境的安裝首先,基本的 Python3 環境和 PyCharm 開發工具的安裝,由於比較簡單,博主在這裡不再詳細演示了!實在有問題的可以自行Google或者百度。其次就是GUI開發環境的安裝,也就是安裝PyQT5。這裡演示在Python的虛擬環境中來安裝PyQT5(Ubuntu Linux系統):
# 在Python全局環境中安裝pipenv
$ pip3 install pipenv -i https://pypi.tuna.tsinghua.edu.cn/simple
# 創建項目目錄
$ mkdir pyqt5-pro
# 進入項目目錄
$ cd pyqt5-pro/
# 創建虛擬環境
$ pipenv --three
# 激活虛擬環境(激活環境後會自動創建Pipfile文件)
$ pipenv shell
# 為加速安裝,將源改為國內源
(pyqt5-pro) $ vim Pipfile
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
# 安裝pyqt5庫
(pyqt5-pro) $ pipenv install pyqt5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
這個時候我們使用Pycharm打開這個項目文件夾:
可以從設置中看到該項目依賴的Python環境:
示例代碼:
from PyQt5.Qt import *
import sys
if __name__ == '__main__':
# 創建QApplication類的實例
app = QApplication(sys.argv)
# 創建一個窗口
window = QWidget()
# 設置窗口標題
window.setWindowTitle('Hello World!')
# 設置窗口尺寸
window.resize(400, 400)
# 移動窗口位置
window.move(1000, 300)
# 創建label控制項
label = QLabel(window)
# 為控制項設置文本
label.setText('Hello World!')
# 移動空間的位置
label.move(160, 160)
# 顯示窗口
window.show()
# 進入程序的主循環,並通過exit函數確保主循環安全結束
sys.exit(app.exec_())
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
效果圖[在windows平臺中顯示有差別於Linux(注意我這不是Mac OS系統,只是ubuntu linux系統使用了Mac OS的主題)]:
安裝Qt的工具包:
pip install PyQt5-tools -i https://pypi.douban.com/simple
安裝完成後,QTdesigner 就在你的 python 環境下的擴展包裡面了!
將QtDesigner集成到Pycharm:
可以通過配置好的PyCharm擴展工具直接打開QTDesigner:
簡單介紹QTDesigner幾個主要部分:
Ctrl+S後可以將其保存到項目根目錄:
第一種方法:
$ python -m PyQt5.uic.pyuic demo.ui -o demo.py
第二種方法:
$ pyuic5 demo.ui -o demo.py
第三種方法:把第一種方法中命令集成到 PyCharm 中,首先需要使用 $ which python 查看當前使用的Python目錄,
(pyqt5-pro) $ which python
/home/thanlon/.local/share/virtualenvs/pyqt5-pro-ihgfaRRJ/bin/python
將其複製粘貼到【Program】部分。然後再把 -m PyQt5.uic.pyuic $FileName$ -o $FileNameWithoutExtension$.py 加入到【Arguments】部分。再把 $FileDir$ 加入到【Working directory】中:
轉換之後,在項目目錄下會生成.py文件:
使用水平布局的方式在QtDesigner中做一些簡單的操作,如下圖所示:
將.ui文件轉換成.py文件後新建 RunMainWinHorizontalLayout.py 文件用來運行轉換之後的.py文件 MainWinHorizontalLayout.py:
import sys
import MainWinHorizontalLayout
from PyQt5.QtWidgets import QApplication, QMainWindow
if __name__ == '__main__':
# 創建QApplication類的實例
app = QApplication(sys.argv)
# 創建一個主窗口
mainWindow = QMainWindow()
# 創建Ui_MainWindow的實例
ui = MainWinHorizontalLayout.Ui_MainWindow()
# 調用setupUi在指定窗口(主窗口)中添加控制項
ui.setupUi(mainWindow)
# 顯示窗口
mainWindow.show()
# 進入程序的主循環,並通過exit函數確保主循環安全結束
sys.exit(app.exec_())
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
運行這個Python文件得到:
使用垂直布局的方式在QtDesigner中了做一些簡單的操作,如下圖所示:
將.ui文件轉換成.py文件後新建 RunMainWinVerticalLayout.py 文件用來運行轉換之後的.py文件 MainWinVerticalLayout.py:
import sys
import MainWinVerticalLayout
from PyQt5.QtWidgets import QApplication, QMainWindow
if __name__ == '__main__':
# 創建QApplication類的實例
app = QApplication(sys.argv)
# 創建一個主窗口
mainWindow = QMainWindow()
# 創建Ui_MainWindow的實例
ui = MainWinVerticalLayout.Ui_MainWindow()
# 調用setupUi在指定窗口(主窗口)中添加控制項
ui.setupUi(mainWindow)
# 顯示窗口
mainWindow.show()
# 進入程序的主循環,並通過exit函數確保主循環安全結束
sys.exit(app.exec_())
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
運行這個.py文件得到:
「姓名」和「薪資」兩行都使用水平布局,「備註+文本框」和它們一起使用垂直布局:
將.ui文件轉換成.py文件後新建 RunMainWinHVLayout.py 文件用來運行轉換之後的.py文件:
import sys
import RunMainWinVHLayout
from PyQt5.QtWidgets import QApplication, QMainWindow
if __name__ == '__main__':
# 創建QApplication類的實例
app = QApplication(sys.argv)
# 創建一個主窗口
mainWindow = QMainWindow()
# 創建Ui_MainWindow的實例
ui = RunMainWinVHLayout.Ui_MainWindow()
# 調用setupUi在指定窗口(主窗口)中添加控制項
ui.setupUi(mainWindow)
# 顯示窗口
mainWindow.show()
# 進入程序的主循環,並通過exit函數確保主循環安全結束
sys.exit(app.exec_())
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2.7 柵格布局下面是使用柵格布局設計的:
將.ui文件轉換成.py文件後新建 RunMainWinGridLayout.py 文件用來運行轉換之後的.py文件:
import sys
import MainWinGridLayout
from PyQt5.QtWidgets import QApplication, QMainWindow
if __name__ == '__main__':
# 創建QApplication類的實例
app = QApplication(sys.argv)
# 創建一個主窗口
mainWindow = QMainWindow()
# 創建Ui_MainWindow的實例
ui = MainWinGridLayout.Ui_MainWindow()
# 調用setupUi在指定窗口(主窗口)中添加控制項
ui.setupUi(mainWindow)
# 顯示窗口
mainWindow.show()
# 進入程序的主循環,並通過exit函數確保主循環安全結束
sys.exit(app.exec_())
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2.8 表單布局下面是使用表單布局設計的:
將.ui文件轉換成.py文件後新建 RunMainWinFormLayout.py 文件用來運行轉換之後的.py文件:
import sys
import MainWinFormLayout
from PyQt5.QtWidgets import QApplication, QMainWindow
if __name__ == '__main__':
# 創建QApplication類的實例
app = QApplication(sys.argv)
# 創建一個主窗口
mainWindow = QMainWindow()
# 創建Ui_MainWindow的實例
ui = MainWinFormLayout.Ui_MainWindow()
# 調用setupUi在指定窗口(主窗口)中添加控制項
ui.setupUi(mainWindow)
# 顯示窗口
mainWindow.show()
# 進入程序的主循環,並通過exit函數確保主循環安全結束
sys.exit(app.exec_())
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
右鍵選擇布局的時候選擇「在窗體布局中布局」。
2.9 容器布局布局和容器之間可以相互轉換,下面以 QFrame 和 Grid Layout 相互轉換為例子。第一個是把容器 QFrame 轉換成 Grid Layout,第二個是把 Grid Layout 轉換成容器 QFrame:
將 .ui 文件轉換成 .py 文件後新建 RunMainWinContainerLayout.py 文件用來運行轉換之後的 .py 文件:
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
import MainWinContainerLayout
if __name__ == '__main__':
# 創建QApplication類的實例
app = QApplication(sys.argv)
# 創建一個主窗口
mainWindow = QMainWindow()
# 創建Ui_MainWindow的實例
ui = MainWinContainerLayout.Ui_MainWindow()
# 調用setupUi在指定窗口(主窗口)中添加控制項
ui.setupUi(mainWindow)
# 顯示窗口
mainWindow.show()
# 進入程序的主循環,並通過exit函數確保主循環安全結束
sys.exit(app.exec_())
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2.10 絕對布局直接把空間放到容器或者窗口中默認是絕對布局,根據坐標屬性可以控制顯示的位置:
將 .ui 文件轉換成 .py 文件後新建 RunMainWinAbsoluteLayout.py 文件用來運行轉換之後的 .py 文件,發現出現報錯:
/home/thanlon/PycharmProjects/venv/pyqt5-pro/bin/python /home/thanlon/PycharmProjects/pyqt5-pro/2.QtDesigner/絕對布局/RunMainWinHorizontalLayout.py
Traceback (most recent call last):
File "/home/thanlon/PycharmProjects/pyqt5-pro/2.QtDesigner/絕對布局/RunMainWinHorizontalLayout.py", line 2, in <module>
import MainWinAbsoluteLayout
File "/home/thanlon/PycharmProjects/pyqt5-pro/2.QtDesigner/絕對布局/MainWinAbsoluteLayout.py", line 75, in <module>
from PyQt5 import QtWebKitWidgets
ImportError: cannot import name 'QtWebKitWidgets' from 'PyQt5' (/home/thanlon/PycharmProjects/venv/pyqt5-pro/lib/python3.8/site-packages/PyQt5/__init__.py)
可以使用 from PyQt5.QtWebEngineWidgets import * 替換 from PyQt5 import QtWebKitWidgets。
MainWinAbsoluteLayout.py:
# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
...
# self.webView = QtWebKitWidgets.QWebView(self.centralwidget)
self.webView = QWebEngineView(self.centralwidget)
...
# from PyQt5 import QtWebKitWidgets
from PyQt5.QtWebEngineWidgets import *
RunMainWinAbsoluteLayout.py:
import sys
import MainWinAbsoluteLayout
from PyQt5.QtWidgets import QApplication, QMainWindow
if __name__ == '__main__':
# 創建QApplication類的實例
app = QApplication(sys.argv)
# 創建一個主窗口
mainWindow = QMainWindow()
# 創建Ui_MainWindow的實例
ui = MainWinAbsoluteLayout.Ui_MainWindow()
# 調用setupUi在指定窗口(主窗口)中添加控制項
ui.setupUi(mainWindow)
# 顯示窗口
mainWindow.show()
# 進入程序的主循環,並通過exit函數確保主循環安全結束
sys.exit(app.exec_())
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2.11 布局中的間隔和分割線間隔分為水平和垂直間隔,分別是 Horizontal Spacer 和 Vertical Spacer 兩個控制項。分割線也分為水平和垂直分割線,使用的控制項分別是 Horizontal Line 和 Vertical Line。分割線控制項可以讓兩個控制項之間有一條分割線,通常用分割線控制項將相同或類似功能的控制項放在一起,形成一個組。
RunMainWinSpacerLineLayout.py:
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
import MainWinSpacerLineLayout
if __name__ == '__main__':
# 創建QApplication類的實例
app = QApplication(sys.argv)
# 創建一個主窗口
mainWindow = QMainWindow()
# 創建Ui_MainWindow的實例
ui = MainWinSpacerLineLayout.Ui_MainWindow()
# 調用setupUi在指定窗口(主窗口)中添加控制項
ui.setupUi(mainWindow)
# 顯示窗口
mainWindow.show()
# 進入程序的主循環,並通過exit函數確保主循環安全結束
sys.exit(app.exec_())
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2.12 控制項最大尺寸和最小尺寸控制項最大尺寸和最小尺寸分別由控制項的 minimunmSize 和 maximumSize 屬性來設置的,
每個控制項都有期望尺寸,每一個控制項的期望尺寸都是不一樣的。未設置控制項的最大值和最小值,推薦設置的尺寸,即建議尺寸。對大多數控制項,期望尺寸是固定值,不能夠去設置的。我們可以獲取控制項的期望尺寸:
RunMainWinSizePolicyLayout.py:
# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
pass
# 列印pushButton控制項的期望尺寸
push_button_width = self.pushButton.sizeHint().width()
push_button_height = self.pushButton.sizeHint().height()
print('pushButton控制項期望尺寸的寬度:{}px'.format(push_button_width))
print('pushButton控制項期望尺寸的高度:{}px'.format(push_button_height))
"""
pushButton控制項期望尺寸的寬度:48px
pushButton控制項期望尺寸的高度:25px
"""
pass
# 列印line_Edit控制項的期望尺寸
line_Edit_width = self.lineEdit.sizeHint().width()
line_Edit_height = self.lineEdit.sizeHint().height()
print('lineEdit控制項期望尺寸的寬度:{}px'.format(line_Edit_width))
print('lineEdit控制項期望尺寸的高度:{}px'.format(line_Edit_height))
"""
lineEdit控制項期望尺寸的寬度:142px
lineEdit控制項期望尺寸的高度:25px
"""
pass
def retranslateUi(self, MainWindow):
pass
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
還有最小期望尺寸的概念,對於很多控制項期望尺寸和最小期望尺寸是一樣的,如 pushButton 控制項:
# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
pass
# 列印pushButton控制項的最小期望尺寸
push_button_minimum_width = self.pushButton.minimumSizeHint().width()
push_button_minimum_height = self.pushButton.minimumSizeHint().height()
print('pushButton控制項最小期望尺寸的寬度:{}px'.format(push_button_minimum_width))
print('pushButton控制項最小期望尺寸的高度:{}px'.format(push_button_minimum_height))
"""
pushButton控制項最小期望尺寸的寬度:48px
pushButton控制項最小期望尺寸的高度:25px
"""
pass
def retranslateUi(self, MainWindow):
pass
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
也有不一樣的如 lineEdit 控制項:
# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
pass
# 列印line_Edit控制項的最小期望尺寸
line_Edit_minimum_width = self.lineEdit.minimumSizeHint().width()
line_Edit_minimum_height = self.lineEdit.minimumSizeHint().height()
print('lineEdit控制項最小期望寬度:{}px'.format(line_Edit_minimum_width))
print('lineEdit控制項最小期望高度:{}px'.format(line_Edit_minimum_height))
"""
lineEdit控制項最小期望寬度:59px
lineEdit控制項最小期望高度:25px
"""
pass
def retranslateUi(self, MainWindow):
pass
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
尺寸策略的應用,使用常用的屬性值 Expanding:
RunMainWinExpendingLayout.py:
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
import MainWinExpandingLayout
if __name__ == '__main__':
# 創建QApplication類的實例
app = QApplication(sys.argv)
# 創建一個主窗口
mainWindow = QMainWindow()
# 創建Ui_MainWindow的實例
ui = MainWinExpandingLayout.Ui_MainWindow()
# 調用setupUi在指定窗口(主窗口)中添加控制項
ui.setupUi(mainWindow)
# 顯示窗口
mainWindow.show()
# 進入程序的主循環,並通過exit函數確保主循環安全結束
sys.exit(app.exec_())
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2.14 設置控制項之間的夥伴關係把兩個控制項關聯到一起,通過其中一個控制項控制另外一個控制項。使用 Form Layout 布局在裡面添加 Label 和 Line Edit 空間,
預覽後同時按鍵盤中的 「ALT」和「A」 滑鼠會定位到姓名的文本框中。同理,「ALT」和「B」 滑鼠會定位到年齡的文本框中。
RunMainWinBuddyLayout.py:
import sys
import MainWinBuddyLayout
from PyQt5.QtWidgets import QApplication, QMainWindow
if __name__ == '__main__':
# 創建QApplication類的實例
app = QApplication(sys.argv)
# 創建一個主窗口
mainWindow = QMainWindow()
# 創建Ui_MainWindow的實例
ui = MainWinBuddyLayout.Ui_MainWindow()
# 調用setupUi在指定窗口(主窗口)中添加控制項
ui.setupUi(mainWindow)
# 顯示窗口
mainWindow.show()
# 進入程序的主循環,並通過exit函數確保主循環安全結束
sys.exit(app.exec_())
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2.15 修改控制項的Tab順序控制項布局好之後,如果是要求用戶輸入的控制項,可以使用 Tab 鍵進行切換。實際上使用 Tab 鍵切換默認是按照控制項添加順序,當然還可以修改控制項的 Tab 順序。修改控制項的 Tab 順序有兩種方法,方法一:選擇 Edit --> 編輯 Tab 順序:
雙擊序號可切換序號:
也可以選中序號,右鍵選擇」制表符順序列表「來調整順序:
信號(signal)與槽(slot)是 QT 的核心機制,也是 PyQt 的核心機制。信號:對象或者控制項發出去的消息。單擊一個按鈕的時候按鈕就會向外部發送單擊的消息,這些發送出去的信號需要一些代碼來攔截,這些代碼就是槽。槽的本質是函數或方法,單擊一個按鈕其實就是執行了槽所對應的函數或方法,這個函數或方法本質上就相當於這個按鈕的單擊事件。
簡單理解就是:信號就是一個單擊事件,槽就是單擊事件所對應的事件函數。一個信號可以和多個槽綁定,一個槽可以攔截多個信號。
下面使用 QtDesigner 來完成信號與槽的綁定:
選擇編輯信號/槽,為 「關閉窗口」 按鈕添加點擊事件,槽為 close( ) 函數:
預覽之後,點擊按鈕會關閉窗口:
例子1:控制文本輸入框的顯示和隱藏
預覽後的效果:
例子2:控制文本輸入框是否可用
預覽後的效果:
使用 QtDesigner 創建一個主窗口時,默認會在主窗口的上方添加一行菜單欄,在最下方添加一行狀態欄。如果我們需要添加工具欄則需要單擊右鍵選擇【添加工具欄】,這部分主要探討如何在窗口中創建菜單和工具欄以及分別向菜單欄、工具欄中添加菜單項、按鈕。
默認菜單已經創建,所以只需要為菜單添加菜單項:
創建工具欄並且將按鈕添加到工具欄中:
有三種類型的窗口,分別是 QMainWindow、QDialog 和 QWidget。QMainWindow:可以包括菜單欄、工具欄、狀態欄和標題欄,是最常見的窗口形式。QDialog:是對話窗口的基類。沒有菜單欄、工具欄、標題欄。QWidget:不確定窗口的類型,就可以使用 QWidget。創建一個主窗口:
FirstMainWindow.py:
"""
@from:https://pythoneers.cn
@author: qq3330447288
@contact: erics1996@yeah.net
@software: PyCharm
@file: FirstMainWindow.py
@time: 2020/11/17 上午9:50
"""
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
from PyQt5.QtGui import QIcon
class FirstMainWin(QMainWindow):
def __init__(self):
"""
初始化
:param parent:控制項放到parent
"""
super(FirstMainWin, self).__init__()
# 設置主窗口的標題
self.setWindowTitle('第一個窗口應用')
# 設置窗口的尺寸
self.resize(400, 300)
# 獲取當前的狀態欄(默認是有狀態欄的)
self.status = self.statusBar()
# 設置狀態欄顯示的消息(消息只存在5s)
self.status.showMessage('只顯示5s的消息!', 5000)
if __name__ == '__main__':
# 創建一個應用程式對象(傳入參數)
app = QApplication(sys.argv)
# 設置應用程式的圖標
app.setWindowIcon(QIcon('../images/Dragon.ico'))
# 創建窗口類的對象
main = FirstMainWin()
# 顯示窗口
main.show()
# 調用exit()進入程序的主循環
sys.exit(app.exec_())
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
3.2 主窗口居中顯示PyQt5中沒有API直接讓窗口居中,所以需要自己去寫。主窗口居中顯示需要計算窗口的左上角的坐標值,橫坐標可以通過屏幕的寬度減去窗口的寬度除以2,縱坐標可以通過屏幕的高度減去窗口的高度除以2。完成計算後可以使用move方法移動窗口。
CenterWindow.py:
"""
@from:https://pythoneers.cn
@author: qq3330447288
@contact: erics1996@yeah.net
@software: PyCharm
@file: FirstMainWindow.py
@time: 2020/11/17 上午9:50
"""
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QDesktopWidget
from PyQt5.QtGui import QIcon
class CenterMainWin(QMainWindow):
def __init__(self):
"""
初始化
:param parent:控制項放到parent
"""
super(CenterMainWin, self).__init__()
# 設置主窗口的標題
self.setWindowTitle('窗口居中')
# 設置窗口的尺寸
self.resize(400, 300)
# 獲取當前的狀態欄(默認是有狀態欄的)
self.status = self.statusBar()
# 設置狀態欄顯示的消息(消息只存在5s)
self.status.showMessage('只顯示5s的消息!', 5000)
def center(self):
# 獲取屏幕坐標系
screen = QDesktopWidget().screenGeometry()
# 獲取窗口坐標系
size = self.geometry()
left = (screen.width() - size.width()) / 2
top = (screen.height() - size.height()) / 2
# 移動窗口
self.move(left, top)
if __name__ == '__main__':
# 創建一個應用程式對象(傳入參數)
app = QApplication(sys.argv)
# 設置應用程式的圖標
app.setWindowIcon(QIcon('../images/Dragon.ico'))
# 創建窗口類的對象
main = CenterMainWin()
# 顯示窗口
main.show()
# 窗口居中
main.center()
# 調用exit()進入程序的主循環
sys.exit(app.exec_())
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
3.3 退出應用程式退出應用程式,即退出整個窗口,
QuitApplication.py:
"""
@from:https://pythoneers.cn
@author: qq3330447288
@contact: erics1996@yeah.net
@software: PyCharm
@file: QuitApplication.py
@time: 2020/11/17 上午10:48
"""
import sys
from PyQt5.QtWidgets import QMainWindow, QPushButton, QHBoxLayout, QWidget, QApplication
class QuitApplication(QMainWindow):
def __init__(self):
super(QuitApplication, self).__init__()
self.resize(300, 150)
self.setWindowTitle('退出應用程式')
# 添加按鈕
self.buttion1 = QPushButton('退出應用程式')
# 將信號與槽關聯。信號綁定到方法,每一個信號都有一個connect方法
self.buttion1.clicked.connect(self.onClickButton)
# 設置水平布局(將按鈕放到布局中)
layout = QHBoxLayout()
layout.addWidget(self.buttion1)
# 把布局放到QWidget(所有的控制項都放到Qwiget,Qwiget可以充滿整個窗口)
main_frame = QWidget()
main_frame.setLayout(layout)
# 框架放到窗口上
self.setCentralWidget(main_frame)
def onClickButton(self):
# 通過sender獲取button
sender = self.sender()
# 獲取button的文本
print(sender.text() + ' 按鈕被按下!')
# 創建應用程式對象
app = QApplication.instance()
# 退出應用程式
app.quit()
if __name__ == '__main__':
app = QApplication(sys.argv)
main = QuitApplication()
main.show()
sys.exit(app.exec_())
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
窗口的位置可以通過窗口的左上角的坐標來描述,這個坐標就是相對於屏幕坐標系。我們可以獲取窗口相關的一系列參數:
"""
@from:https://pythoneers.cn
@author: qq3330447288
@contact: erics1996@yeah.net
@software: PyCharm
@file: ScreenGeometry.py
@time: 2020/11/17 上午11:15
"""
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
def on_click_btn():
"""
單擊button列印窗口的坐標和寬度和高度
:return:
"""
print('onclick')
print('-1-')
print('widget.x() = %d' % widget.x()) # 窗口橫坐標
print('widget.y() = %d' % widget.y()) # 窗口縱坐標
print('widget.width() = %d' % widget.width()) # 工作區寬度
print('widget.height() = %d' % widget.height()) # 工作去高度
print('-2-')
print('widget.geometry().x() = %d' % widget.geometry().x()) # 工作區橫坐標
print('widget.geometry().y() = %d' % widget.geometry().y()) # 工作區縱坐標
print('widget.geometry().width() = %d' % widget.geometry().width()) # 工作區寬度
print('widget.geometry().height() = %d' % widget.geometry().height()) # 工作區高度
print('-3-')
print('widget.geometry().x() = %d' % widget.frameGeometry().x()) # 窗口橫坐標
print('widget.geometry().y() = %d' % widget.frameGeometry().y()) # 窗口縱坐標
print('widget.geometry().width() = %d' % widget.frameGeometry().width()) # 窗口寬度
print('widget.geometry().height() = %d' % widget.frameGeometry().height()) # 窗口高度(包括標題欄)
if __name__ == '__main__':
app = QApplication(sys.argv)
# 使用Qwigit創建窗口
widget = QWidget()
# 在窗口放按鈕
btn = QPushButton(widget)
# 設置按鈕的文本
btn.setText('按鈕')
# 設置按鈕相對於窗口(工作區)的位置
btn.move(10, 10)
# 綁定槽
btn.clicked.connect(on_click_btn)
# 設置工作區的尺寸
widget.resize(300, 300)
# 設置窗口的坐標(對於屏幕的位置)
widget.move(200, 200)
# 設置窗口標題欄文字
widget.setWindowTitle('屏幕坐標系')
# 顯示窗口
widget.show()
# 進入事件循環
sys.exit(app.exec_())
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
窗口相對於坐標系的位置和尺寸,側面可以得到標題欄的高度是31px。
使用 setWindowIcon 方法來設置圖標,窗口的 setWindowIcon 方法用於設置窗口的圖標,只在 Windows 中可用,只能在標題欄左上角顯示圖標。QApplication 中的 setWindowIcon 方法可以用來設置主窗口的圖標和應用程式的圖標,但是如果主窗口已經設置了的圖標,這裡只能用於設置應用程式的圖標。
"""
@from:https://pythoneers.cn
@author: qq3330447288
@contact: erics1996@yeah.net
@software: PyCharm
@file: WinAndApplicationIcon.py.py
@time: 2020/11/17 上午11:33
"""
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
from PyQt5.QtGui import QIcon
class WinAndApplicationIcon(QMainWindow):
def __init__(self):
super(WinAndApplicationIcon, self).__init__()
self.init_ui()
def init_ui(self):
# 設置主窗口的標題
self.setWindowTitle('設置窗口圖標')
# 同時設置主窗口的尺寸和位置
self.setGeometry(400, 400, 300, 200)
# 設置窗口圖標
self.setWindowIcon(QIcon('../images/Basilisk.ico'))
if __name__ == '__main__':
# 創建一個應用程式對象(傳入參數)
app = QApplication(sys.argv)
# 設置應用程式的圖標
app.setWindowIcon(QIcon('../images/Dragon.ico')) # 可以用來設置主窗口的圖標和應用程式的圖標,但是如果主窗口已經設置了的圖標,這裡只能用於設置應用程式的圖標
# 創建窗口類的對象
main = WinAndApplicationIcon()
# 顯示窗口
main.show()
# 調用exit()進入程序的主循環
sys.exit(app.exec_())
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
3.6 控制項添加提示消息當滑鼠放在控制項上的時候,可以顯示提示消息。使用 setToolTip 方法設置的消息內容支持富文本。
"""
@from:https://pythoneers.cn
@author: qq3330447288
@contact: erics1996@yeah.net
@software: PyCharm
@file: ToolTip.py
@time: 2020/11/17 上午11:39
"""
import sys
from PyQt5.QtGui import QFont
from PyQt5.QtWidgets import QMainWindow, QToolTip, QHBoxLayout, QWidget, QPushButton, QApplication
class ToolTip(QMainWindow):
def __init__(self):
super(ToolTip, self).__init__()
self.init_ui()
def init_ui(self):
QToolTip.setFont(QFont('SansSerif', 12))
self.setToolTip('你好,<b>Erics</b>')
self.setGeometry(300, 300, 300, 150)
self.setWindowTitle('設置控制項提示消息')
self.button1 = QPushButton('按鈕')
self.button1.setToolTip('這是一個按鈕!')
layout = QHBoxLayout()
layout.addWidget(self.button1)
main_frame = QWidget()
main_frame.setLayout(layout)
self.setCentralWidget(main_frame)
if __name__ == '__main__':
app = QApplication(sys.argv)
tool_tip = ToolTip()
tool_tip.show()
sys.exit(app.exec_())
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
4. PyQt5中常用控制項API的使用4.1 QLabel控制項的基本用法QLabel 控制項是用來顯示文本信息的,QLabel 控制項相關的方法如下:
方法名說明setAlignment()設置文本的對齊方式setIndent()設置文本縮進text()獲取文本內容setBuddy()設置夥伴關係setText()設置文本內容selectedText()返回所選的字符setWordWrap()設置是否允許換行QLabel 控制項常用的信號(事件)
信號說明linkHoverd當滑鼠滑過QLabel控制項時觸發linkActivated當滑鼠單擊QLabel控制項時觸發"""
@from:https://pythoneers.cn
@author: qq3330447288
@contact: erics1996@yeah.net
@software: PyCharm
@file: QLabelDemo.py
@time: 2020/11/17 下午5:56
"""
import sys
from PyQt5.QtGui import QPalette, QPixmap
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QWidget, QLabel, QVBoxLayout, QApplication
class QLabelDemo(QWidget):
def __init__(self):
super().__init__()
# 初始化窗口界面
self.init_ui()
def init_ui(self):
# 創建4個QLabel控制項
label1 = QLabel(self)
label2 = QLabel(self)
label3 = QLabel(self)
label4 = QLabel(self)
# 設置label1文本(支持html標籤)
label1.setText('<font color="orange">這是一個文本標籤</font>')
# 創建調色板
palette = QPalette()
palette.setColor(QPalette.Window, Qt.blue) # 設置控制項的背景色
# 設置label1使用創建的調色板(設置label1控制項的背景色)
label1.setPalette(palette)
# 設置label1自動填充背景
label1.setAutoFillBackground(True)
# 設置label1居中對齊
label1.setAlignment(Qt.AlignCenter)
# 設置label2的文本
label2.setText('<a href="#">歡迎你使用Python GUI程序!</a>') # 跳轉網頁或者是點擊事件
# 設置label2文本居中
label3.setAlignment(Qt.AlignCenter)
# 設置提示信息
label3.setToolTip('這是一個圖片標籤!')
# 設置標籤下顯示圖片
label3.setPixmap(QPixmap('../images/python.jpg'))
# 設置label4的文本
label4.setText('<a href="https://pythoneers.cn">感謝您訪問我的網站!</a>')
# 屏蔽事件(點擊之後打開網頁,而不是觸發事件)
label4.setOpenExternalLinks(True) # False是響應事件
# 設置label4右對齊
label4.setAlignment(Qt.AlignRight)
# 設置提示信息
label4.setToolTip('這是一個超連結!')
# 創建垂直布局對象
vbox = QVBoxLayout()
# 將label1、label2、label2、label3控制項添加到布局中
vbox.addWidget(label1)
vbox.addWidget(label2)
vbox.addWidget(label3)
vbox.addWidget(label4)
# 滑過label2標籤的信號綁定到槽(函數)
label2.linkHovered.connect(self.linkHovered)
# 點擊label4標籤的信號綁定槽(函數)
label4.linkActivated.connect(self.linkClicked)
# 設置窗口的布局
self.setLayout(vbox)
# 設置窗口標題
self.setWindowTitle('QLabel控制項演示')
def linkHovered(self):
"""
當滑鼠划過標籤label2時觸發事件
:return:
"""
print('當滑鼠划過標籤label2時觸發事件')
def linkClicked(self):
"""
當滑鼠單擊標籤label4時觸發事件
:return:
"""
print('當滑鼠單擊標籤label4時觸發事件')
if __name__ == '__main__':
app = QApplication(sys.argv)
mainWindow = QLabelDemo()
mainWindow.show()
sys.exit(app.exec_())
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
4.2 QLabel與夥伴控制項這裡使用代碼設置夥伴控制項如下:
QLabelBuddy.py:
"""
@from:https://pythoneers.cn
@author: qq3330447288
@contact: erics1996@yeah.net
@software: PyCharm
@file: QLabelBuddy.py
@time: 2020/11/17 下午6:26
"""
import sys
from PyQt5.QtWidgets import QDialog, QLabel, QLineEdit, QPushButton, QGridLayout, QApplication
class QLabelBuddy(QDialog):
def __init__(self):
super().__init__()
# 初始化實例的時候執行
self.init_ui()
def init_ui(self):
# 設置窗口標題欄文本
self.setWindowTitle('QLabel與夥伴控制項')
# 創建QLabel控制項
nameQLabel = QLabel('&Name', self)
# 創建QLineEdit控制項
nameQLineEdit = QLineEdit(self)
# 設置夥伴控制項
nameQLabel.setBuddy(nameQLineEdit)
# 創建QLabel控制項
passwordQLabel = QLabel('&Pwd', self)
# 創建QLineEdit控制項
passwordQLineEdit = QLineEdit(self)
# 設置夥伴控制項
passwordQLabel.setBuddy(passwordQLineEdit)
ok_btn = QPushButton('&OK')
cancel_btn = QPushButton('&Cancel')
# 創建柵格布局
mainLayout = QGridLayout(self)
# 將nameQLabel添加到柵格布局中
mainLayout.addWidget(nameQLabel, 0, 0)
# 將nameQLineEdit添加到柵格布局中
mainLayout.addWidget(nameQLineEdit, 0, 1, 1, 2)
# 將passwordQLabel添加到柵格布局中
mainLayout.addWidget(passwordQLabel, 1, 0)
# 將passwordQLineEdit添加到柵格布局中
mainLayout.addWidget(passwordQLineEdit, 1, 1, 1, 2)
# 將ok_btn添加到布局中
mainLayout.addWidget(ok_btn, 2, 1)
# 將cancel_btn添加到布局中
mainLayout.addWidget(cancel_btn, 2, 2)
"""
行索引rowIndex和列索引columnIndex是控制項在柵格布局中位置,佔用的行數row和佔用的列數column是控制項的尺寸
mainLayout.addWidget(控制項對象, 行索引rowIndex, 列索引columnIndex, 佔用的行數row, 佔用的列數column)
"""
if __name__ == '__main__':
app = QApplication(sys.argv)
QLabel_Buddy = QLabelBuddy()
QLabel_Buddy.show()
sys.exit(app.exec_())
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
4.3 QLineEdit控制項與回顯模式QLineEdit 控制項的基本功能是輸入單行文本,這個控制項還有其它高級內容,如設置回顯模式、掩碼。回顯有4種模式:
QLineEditEchoMode.py:
"""
@from:https://pythoneers.cn
@author: qq3330447288
@contact: erics1996@yeah.net
@software: PyCharm
@file: QLineEditEchoMode.py
@time: 2020/11/24 上午4:06
"""
import sys
from PyQt5.QtWidgets import QWidget, QFormLayout, QLineEdit, QApplication
class QLineEditEchoMode(QWidget):
def __init__(self):
super(QLineEditEchoMode, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('文本輸入框的回顯模式')
# 創建表單布局對象
formLayout = QFormLayout()
# 創建四個LineEdit控制項
normalLineEdit = QLineEdit()
noEchoLineEdit = QLineEdit()
passwordLineEdit = QLineEdit()
passwordEchoOnEdit = QLineEdit()
# 將空間添加到布局中
formLayout.addRow('Normal', normalLineEdit)
formLayout.addRow('NoEcho', noEchoLineEdit)
formLayout.addRow('Password', passwordLineEdit)
formLayout.addRow('PasswordEchoEdit', passwordEchoOnEdit)
# 設置默認的文本提示內容(類似於設置HTML表單中的Placeholder屬性)
normalLineEdit.setPlaceholderText('Normal')
noEchoLineEdit.setPlaceholderText('NoEcho')
passwordLineEdit.setPlaceholderText('Password')
passwordEchoOnEdit.setPlaceholderText('PasswordEchoOnEdit')
# 設置回顯模式
normalLineEdit.setEchoMode(QLineEdit.Normal)
noEchoLineEdit.setEchoMode(QLineEdit.NoEcho)
passwordLineEdit.setEchoMode(QLineEdit.Password)
passwordEchoOnEdit.setEchoMode(QLineEdit.PasswordEchoOnEdit)
# 應用表單布局
self.setLayout(formLayout)
if __name__ == '__main__':
app = QApplication(sys.argv)
main = QLineEditEchoMode()
main.show()
sys.exit(app.exec_())
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
4.4 QLineEdit控制項的校驗器通過校驗器可以限制文本輸入控制項的輸入,如限制只能輸入整數、浮點數或滿足一定條件的字符串。
QLineEditEchoMode.py:
"""
@from:https://pythoneers.cn
@author: qq3330447288
@contact: erics1996@yeah.net
@software: PyCharm
@file: QLineEditValidator.py
@time: 2020/11/24 上午5:14
"""
from PyQt5.QtWidgets import QWidget, QFormLayout, QLineEdit, QApplication
from PyQt5.QtGui import QIntValidator, QDoubleValidator, QRegExpValidator
from PyQt5.QtCore import QRegExp # 引入正則表達式的類
import sys
class QLineEditValidator(QWidget):
def __init__(self):
super(QLineEditValidator, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('QLineEdit控制項的校驗器')
# 創建表單布局對象
formLayout = QFormLayout()
# 創建三個QLineEdit控制項
intLineEdit = QLineEdit()
doubleLineEdit = QLineEdit()
validatorLineEdit = QLineEdit()
# 將控制項添加到布局中
formLayout.addRow('整數類型', intLineEdit)
formLayout.addRow('浮點類型', doubleLineEdit)
formLayout.addRow('字母和數字(正則表達式)', validatorLineEdit)
# 為QLineEdit控添默認提示內容
intLineEdit.setPlaceholderText('整數')
doubleLineEdit.setPlaceholderText('浮點')
validatorLineEdit.setPlaceholderText('字母和數字')
"""
1.設置整數校驗器(只能輸入[1,99]之間的整數)
"""
# 創建QDoubleValidator校驗器對象
intValidator = QIntValidator(self)
# 設置校驗範圍
intValidator.setRange(1, 99)
"""
2.設置浮點校驗器(只能輸入[-99.xx,99.xx],精度要求保留小數點後2位)
"""
# 創建QDoubleValidator校驗器對象
doubleValidator = QDoubleValidator(self)
# 設置校驗範圍
doubleValidator.setRange(-99, 99)
# 正常顯示浮點數
doubleValidator.setNotation(QDoubleValidator.StandardNotation)
# 設置精度,保留小數點後兩位
doubleValidator.setDecimals(2)
"""
3.設置字母和數字(正則表達式)校驗器
"""
# 正則表達式
reg = QRegExp('[a-zA-Z0-9]+$')
# 正則表達式校驗器
validator = QRegExpValidator(self)
# 將正則表達式和正則表達式校驗器綁定到一起
validator.setRegExp(reg)
"""
設置校驗器:綁定校驗器和控制項
"""
intLineEdit.setValidator(intValidator)
doubleLineEdit.setValidator(doubleValidator)
validatorLineEdit.setValidator(validator)
# 應用表單布局
self.setLayout(formLayout)
if __name__ == '__main__':
app = QApplication(sys.argv)
main = QLineEditValidator()
main.show()
sys.exit(app.exec_())
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
QLineEditMask.py:
"""
@from:https://pythoneers.cn
@author: qq3330447288
@contact: erics1996@yeah.net
@software: PyCharm
@file: QLineEditMask.py
@time: 2020/11/25 下午11:41
"""
from PyQt5.QtWidgets import QWidget, QApplication, QFormLayout, QLineEdit
import sys
class QLineEditMask(QWidget):
def __init__(self):
# 調用父類QWidget的__init__方法
super(QWidget, self).__init__()
# 調用類的實例方法初始化窗口界面
self.initUI()
def initUI(self):
# 設置窗口標題
self.setWindowTitle('5.掩碼限制QLineEdit控制項的輸入')
# 創建表單布局
formLayout = QFormLayout()
# 創建QLineEdit控制項
ipLineEdit = QLineEdit()
macLineEdit = QLineEdit()
dateLineEdit = QLineEdit()
licenseLineEdit = QLineEdit()
# 設置掩碼規則(ASCII數字字符允許但不是必須輸入0-9),沒有輸入時顯示下劃線
ipLineEdit.setInputMask('000,000,000,000;_')
# 置掩碼規則( 十六進位格式允許但不是必須輸入A-F,a-f,0-9),沒有輸入時顯示下劃線
macLineEdit.setInputMask('HH:HH:HH:HH:HH:HH;_')
# 置掩碼規則(ASCII數字字符允許但不是必須輸入0-9),沒有輸入時顯示下劃線
dateLineEdit.setInputMask('0000-00-00;_')
# 置掩碼規則(ASCII字母字符必須輸入A-Z、a-z,如果輸入a-z則小寫轉大寫),沒有輸入時顯示#號
licenseLineEdit.setInputMask('>AAAAA-AAAAA-AAAAA-AAAAA-AAAAA;#')
# 將QLineEdit控制項添加到表單布局中
formLayout.addRow('ip地址', ipLineEdit)
formLayout.addRow('mac地址', macLineEdit)
formLayout.addRow('日期', dateLineEdit)
formLayout.addRow('序列號', licenseLineEdit)
# 設置窗口的布局為表單布局
self.setLayout(formLayout)
if __name__ == '__main__':
# 創建應用程式對象
app = QApplication(sys.argv)
# 創建窗口類的對象
mainWindow = QLineEditMask()
# 顯示窗口
mainWindow.show()
# 調用exit()進入程序的主循環
sys.exit(app.exec_())
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
到此這篇關於詳解Python GUI編程之PyQt5入門到實戰的文章就介紹到這了
‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧ END ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧
掃描下方微信,加作者微信進技術交流群,請先自我介紹喔。
關注微信公眾號『技術讓夢想更偉大』,後臺回復「m」查看更多內容。
長按前往圖中包含的公眾號關注