首先上個圖,看看PyQt運作長什麼樣:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiNzkjNwkTN4ETMwIDM2EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
圖檔來自:
http://static.oschina.net/uploads/space/2013/0423/083239_08UQ_5189.jpg
PyQt是一個Python GUI庫。
PyQt4相容Python 2.x和Python 3.x,PyQt5隻能用于Python 3.x。
這裡以PyQt4為例。
一、安裝PyQt4:
- Ubuntu:
或者sudo apt-get install python-qt4
sudo pip install pyqt
- Windows:上SourceForge下載下傳exe吧,最近版本為2015年的4.11.4,預設安裝路徑為
。..\Python27\Lib\site-packages\PyQt4
從PyQt 4.12起,官網不再提供安裝包,需要自己根據平台編譯,有點坑爹。
二、學習之路:
- 第一個PyQt程式:Hello World
- PyQt入門
-
PyQt基本操作
PyQt4 精彩執行個體分析
- PyQt4入門指南 PDF中文版
- 結合Qt Designer的第一個PyQt程式:使用PyQt來編寫第一個Python GUI程式,程式designer.exe在PyQt4路徑下。
控件:
- PyQt4中文教程(翻譯版),原版有圖
- PyQt5應用與實踐
- PyQt對話框:
QtGui.QMessageBox.information(self,"Pyqt","Information" )
response=QtGui.QMessageBox.warning(self,"PyQT","Warning",QtGui.QMessageBox.Yes,QtGui.QMessageBox.No)
response=QtGui.QMessageBox.question(self,"PyQt","Question",QtGui.QMessageBox.Yes,QtGui.QMessageBox.No,QtGui.QMessageBox.Cancel )
if response==QtGui.QMessageBox.No:
#do somthing
- 點選彈出子視窗
- 自定義ListWidget:适用于資料量少
- 自定義ListView,适用于資料量較大:MVC模型
- PyQt4仿微信Windows用戶端界面
事件:
- PyQt4.5 引入了一個新的信号(Signal)和槽(Slot)的概念。新版的監聽事件一般這樣寫:
QtCore.QObject.connect(button,QtCore.SIGNAL('clicked()'),self.onClicked)
舊版的監聽事件一般這樣寫:
button.clicked.connect(self.onClicked)
- PyQt4 信号和槽詳解
UI線程與子線程:
如果在UI線程(主線程)進行耗時操作,如下載下傳網絡檔案等,就會造成堵塞UI線程,表現為界面停止響應。可以通過QThread類來解決這個問題。
- PyQt4–QThread實作界面與算法分離
- PyQt4–QThread實作界面與算法的分離–2
- Updating GUI elements in MultiThreaded PyQT
三、釋出:
- 使用PyInstaller打包成exe檔案
首先,
pip install pyinstaller
然後,進入項目所在檔案夾,運作指令:
pyinstaller -w -F -i myapp.ico -n myapp myapp.py
其中:
-w, –windowed 表示不顯示控制台;
-D, –onedir 表示生成一個目錄;
-F, –onefile 表示生成單個exe檔案;
-i 指定程式圖示檔案;
-n 指定程式名字;
啟動軟體顯示Fatal Error時,:
-c, –console 啟動軟體時顯示控制台可以列印出錯資訊
-d, –debug 輸出詳細啟動資訊
參數詳細說明
常見問題:
- PyInstaller won’t load the PyQt’s images to the GUI
包含資源檔案(圖示、圖檔)的打包
首先建立一個resources.qrc檔案,寫入:
<RCC>
<file>img/app.ico</file>
<file>img/image1.png</file>
<file>img/image2.png</file>
<file>img/image3.png</file>
</qresource>
</RCC>
這個檔案可以在QT Designer的資源浏覽器裡編輯(增删查改)。
然後運作
pyrcc4 resources.qrc -o resources.py
代碼裡使用:
import resources.py
# Omit code...
self.setWindowIcon(QtGui.QIcon(':/img/app.ico'))
注意冒号是必需的。
包含額外檔案(如.ui檔案)的打包
簡便方法,增加
--add-data
參數:
pyinstaller --add-data ui/*.ui:ui
較複雜方法,适合寫代碼建構:
首先,生成spec檔案
pyi-makespec options -n app main.py
options跟上面pyinstaller一樣
然後修改app.spec檔案:
# -*- mode: python -*-
block_cipher = None
a = Analysis(['main.py'],
pathex=['G:\\Code\\PycharmProjects\\peach'],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
exclude_binaries=True,
name='app',
debug=True,
strip=False,
upx=True,
console=True )
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
name='app')
datas=[
( '/mygame/sfx/*.mp3', 'sfx' ),
( 'src/README.txt', '.' )
]
表示将
/mygame/sfx/*.mp3
檔案複制到
sfx
檔案夾下,将
src/README.txt
複制到根目錄下
最後運作
pyinstaller app.spec
執行建構
詳細可參考Using Spec Files
四、号外:
最後發現有一個跟PyQt差不多的的東西:PySide。
兩者都是基于Qt的,文法基本一模一樣。
兩者的協定不同,PyQt是GPL的,而PySide是LPGL的。
而且PySide的文檔感覺Very Good,畢竟是Qt官方維護的。