PyQt入門(第一個PyQt應用)
一、PyQt介紹
PyQt是一個創建GUI應用程序的工具包。它是Python編程語言和Qt庫的成功融合。Qt庫是目前最強大的庫之一。PyQt是由Phil Thompson 開發。
PyQt實現了一個Python模塊集。它有超過300類,將近6000個函數和方法。它是一個多平臺的工具包,可以運行在所有主要操作系統上,包括UNIX,Windows和Mac。 PyQt採用雙許可證,開發人員可以選擇GPL和商業許可。在此之前,GPL的版本只能用在Unix上,從PyQt的版本4開始,GPL許可證可用於所有支持的平臺。
二、python GUI框架簡介,pyqt介紹,爲什麼使用pyqt
python開發GUI程序,瞭解一個框架需要了解:
(1)運行效果
(2)能夠運行在哪些平臺
(3)學習成本,因爲每一個GUI框架都有自己的特點
(4)開發效率的比較,python的運行效率比c c++低,但是開發效率是比較快的
python GUI框架:
(1)Tkinter: python內置的GUI框架,使用TCL實現,python中內嵌了TCL解釋器,使用它的時候不用安裝額外的擴展包,直接import,跨平臺。不足之處在於UI佈局全靠代碼實現,只有15種常用部件,顯示效果簡陋。
(2)Wxpython:用得比較廣泛,跨平臺,C++編寫,需要安裝擴展模塊;文檔少,遇到問題不好解決,代碼佈局控件,不直觀。
(3)Pygtk: python對GTK+GUI庫的封裝,在linux平臺上運行的比較好,需要安裝擴展模塊,在windows下的兼容性有一些問題。
(4)pyqt:QT原本是諾基亞的產品,源碼用C++寫的,python對QT的包裝,跨平臺,本地顯示效果,根據系統決定,在win7下就是win7的顯示效果;pyqt與qt的函數接口一致,qt開發問的那個豐富,所以pyqt開發文檔也比較豐富;控件豐富,函數/方法多,拖曳佈局;方便打包成二進制文件;GPL協議,商業程序需要購買商業版授權
(5)pyside:諾基亞的親兒子,python對QT的封裝,安裝擴展模塊,跨平臺,與pyqt的API一樣,LGPL協議,新軟件可以是私有的,代碼佈局
(6)Kivy: 針對多點觸控程序,智能手機平板等,也可以在沒有觸屏功能的系統上,全平臺支持;使用python和cython(python和c語言的接口)編寫;中文支持差,需要自己下載中文庫並且制定路徑。
爲什麼使用pyqt:
- 因爲API與qt一致,學會了pyqt再使用qt很簡單
- 文檔豐富
- 學習成本低
- 開發迅速,qt designer拖曳佈局,如果使用代碼佈局還需要構建全局並且調試
- 學習經驗容易遷移到pyside來開發商業應用
- 方便打包發佈軟件,python本身解釋語言的特點是寫好的程序不編譯和鏈接,使用文本運行解釋器,邊解釋邊執行,用戶不可能裝一個解釋器再發源碼再執行,所以打包成exe再發布
三、安裝與配置
1.安裝
安裝pyqt5
pip install pyqt5
or pip3 install pyqt5
Windows安裝PyQt-tools
pip3 install pyqt5-tools
Mac和Linux都不支持PyQt5-tools所以直接安裝Qt Designer即可
-
Mac
pip install Qt
-
Linux
注:由於我用的Manjaro已經內置了Qt Designer,所以這裏寫ubuntu下的安裝方法
sudo apt-get install qt5-default qttools5-dev-tools
terminal中查看是否安裝成功PyQt
rex@rex-linux ~ pip list
Package Version
-------------------- --------
appdirs 1.4.3
btrfsutil 1.1.1
CacheControl 0.12.5
chardet 3.0.4
colorama 0.4.1
cupshelpers 1.0
distlib 0.2.9
distro 1.4.0
docopt 0.6.2
html5lib 1.0.1
idna 2.8
Jade-Application-Kit 2.0.7
keyutils 0.5
lockfile 0.12.2
louis 3.10.0
msgpack 0.6.1
npyscreen 4.10.5
numpy 1.16.4
opencv-python 4.1.0.25
packaging 19.0
pacman-mirrors 4.14.2
pep517 0.5.0
Pillow 6.1.0
pip 19.0.3
progress 1.5
pwquality 1.4.0
pycairo 1.18.1
pycups 1.9.74
pycurl 7.43.0.2
PyGObject 3.32.2
pyparsing 2.4.0
PyQt5 5.13.0
PyQt5-sip 4.19.18
pysmbc 1.0.16
pytoml 0.1.20
PyYAML 5.1
reportlab 3.5.23
requests 2.22.0
retrying 1.3.3
setuptools 41.0.1
six 1.12.0
team 1.0
udiskie 1.7.7
urllib3 1.25.3
webencodings 0.5.1
如圖所示我們已經安裝成功了PyQt5
2.配置
若你已經可以在你的應用程序菜單裏找到Qt Designer那就可以了
[外鏈圖片轉存失敗(img-cdK7Yi3o-1563843564530)(https://s2.ax1x.com/2019/07/20/eS1iCT.png)]
PyCharm配置
注:PyCharm安裝激活方法自行百度,這裏不提供
- 打開PyCharm
File
->Setting
->Tools
->External Tools
[外鏈圖片轉存失敗(img-TwIbK8xa-1563843564532)(https://s2.ax1x.com/2019/07/20/eS1Uat.png)]
-
點擊加號,依次填入
Name:Qt Designer Group:Qt Program:usr/local/designer Arguements:$FileName$ Working directory:$ProjectFileDir$
[外鏈圖片轉存失敗(img-4xnGka2t-1563843564534)(https://s2.ax1x.com/2019/07/20/eS1wPf.png)]
-
再次點擊加號輸入
Name:PyUIC Group:Qt Program:/usr/bin/python3 Arguements:-m PyQt5.uic.pyuic $FileName$ -o $FileNameWithoutExtension$.py Working directory:$FileDir$
[外鏈圖片轉存失敗(img-mSRNAKyo-1563843564535)(https://s2.ax1x.com/2019/07/20/eS38YV.png)]
Ok
->Apply
到這裏PyCharm的配置基本結束
四、第一個PyQt應用程序
1.UI設計
-
打開PyCharm新建一個基於venv的python項目
-
在Setting的Project interpreter中查看是否有PyQt沒有的話自行添加
[外鏈圖片轉存失敗(img-QeaQqMLq-1563843564537)(https://s2.ax1x.com/2019/07/20/eS30T1.png)]
- 打開
Tools
->QT
->Qt Designer
[外鏈圖片轉存失敗(img-Y2gwr3fs-1563843564538)(https://s2.ax1x.com/2019/07/20/eS3f0A.jpg)]
- 新建一個MainWindow ui界面
- 向上拖拉控件並保存名爲
firstMainWindow.ui
[外鏈圖片轉存失敗(img-2JMjRxiL-1563843564543)(https://s2.ax1x.com/2019/07/20/eS3qXQ.png)]
2.ui文件轉換爲.py文件與代碼編寫和運行
要想.ui文件可以被我們程序讀取有兩種方法
-
使用命令行來將.ui編譯爲.py文件
pyuic5 -o firstMainWindow.py firstMainWindow.ui
編譯完成後的firstMainWindow.py文件內容
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.listWidget = QtWidgets.QListWidget(self.centralwidget)
self.listWidget.setGeometry(QtCore.QRect(140, 60, 531, 371))
self.listWidget.setObjectName("listWidget")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 30))
self.menubar.setObjectName("menubar")
self.menuFile = QtWidgets.QMenu(self.menubar)
self.menuFile.setObjectName("menuFile")
self.menuEdit = QtWidgets.QMenu(self.menubar)
self.menuEdit.setObjectName("menuEdit")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.actionNew = QtWidgets.QAction(MainWindow)
self.actionNew.setObjectName("actionNew")
self.actionOpen = QtWidgets.QAction(MainWindow)
self.actionOpen.setObjectName("actionOpen")
self.menuFile.addAction(self.actionNew)
self.menuFile.addAction(self.actionOpen)
self.menubar.addAction(self.menuFile.menuAction())
self.menubar.addAction(self.menuEdit.menuAction())
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.menuFile.setTitle(_translate("MainWindow", "File"))
self.menuEdit.setTitle(_translate("MainWindow", "Edit"))
self.actionNew.setText(_translate("MainWindow", "New"))
self.actionOpen.setText(_translate("MainWindow", "Open"))
-
使用代碼直接讀取.ui文件
這裏我們還是依舊兩種方法來讀取.ui文件
1.使用我們編譯好的firstMainWindow.py文件
2.直接讀取.ui文件
-
使用firstMainWindow.py文件
編寫一個叫CallFirstMainWin.py文件,內容如下
-
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from firstMainWin import *
class MyMainWindow(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MyMainWindow, self).__init__(parent)
self.setupUi(self)
if __name__ == "__main__":
app=QApplication(sys.argv)
myWin = MyMainWindow()
myWin.show()
sys.exit(app.exec_())
這裏我們繼承了firstMainWindow.py中的Ui_MainWindow類來使用我們設計的UI
- 直接讀取.ui文件
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from firstMainWin import *
from PyQt5.uic import loadUi
app = QApplication(sys.argv)
widget = loadUi('firstMainWin.ui')
widget.show()
sys.exit(app.exec_())
這裏是直接使用了loadUi方法來讀取了ui文件
注意:爲了保障界面與邏輯分離我們大部分情況下都使用第一種方法,通過繼承界面文件的主窗口類來完成界面和邏輯的分離
-
運行
[外鏈圖片轉存失敗(img-QziDz2Gz-1563843564545)(https://s2.ax1x.com/2019/07/20/eStTsO.png)]
兩種方式都可以成功運行