天天看點

PyQt4入門

首先上個圖,看看PyQt運作長什麼樣:

PyQt4入門

圖檔來自:

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官方維護的。

繼續閱讀