1. 程式人生 > >Ubuntu 14.04下搭建Python3.4 + PyQt5.3.2 + Eric6.0開發平臺

Ubuntu 14.04下搭建Python3.4 + PyQt5.3.2 + Eric6.0開發平臺

引言

找了很多Python GUI工具集,還是覺得PyQt比較理想,功能強大跨平臺,還支援介面設計器。花一天時間折騰了Ubuntu14.04(32位)+ Python3.4 + Qt5.3.2 + PyQt5.3.2 + Eric6.0 的完整開發平臺的搭建,各種出錯差點放棄了,好在終於一一解決了,記錄下來以後搭建起來方便點。   

安裝Python3.4

Ubuntu14.04貌似預設安裝了Python2.7 和Python3.4。故Python3.4的安裝可略去。

安裝Qt5

Ubuntu14.04自帶Qt4的部分庫檔案,但是我們的平臺要求Qt5,所以首先安裝Qt5.

Qt5.3.2下載:http://qt-project.org/downloads

安裝過程:

下載到的是Qt5的線上安裝程式,為其賦予可執行許可權即可單擊啟動。由於我之前檔案都安裝在/opt目錄下,故這裡以root身份安裝:

sudo chmod a+x qt-opensource-linux-x86-1.6.0-5-online.run 
sudo ./qt-opensource-linux-x86-1.6.0-5-online.run

啟動介面後預設安裝即可。


配置過程:

安裝完成後配置一下PATH,在當前使用者主目錄下的.bashrc (or .zshrc)檔案中加入:

export QTDIR=/opt/Qt/5.3/gcc/

export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${QTDIR}/lib

export PATH=${QTDIR}/bin:${PATH}

  注意${QTDIR}/bin和${PATH}的順序!因為Ubuntu14.04預設${PATH}路徑中的/usr/bin下存在諸多qt命令(確切的說是指向qtchooser的軟連線,qtchooser最終會選擇系統自帶的Qt4命令:但是這些命令預設都不存在),如果${QTDIR}/bin在${PATH}之後,會導致Qt命令失效。

特別是qmake命令,在後續安裝中需要用到,保險起見,在終端輸入qmake,如果顯示qmake命令不存在,請通過建立軟連線進行解決:

將/usr/bin下的qmake軟連線到/opt/Qt/5.3/gcc/bin/qmake上,或者將/usr/lib/i386-linux-gnu/qt4/bin/qmake軟連線到/opt/Qt/5.3/gcc/bin/qmake上:

sudo ln -s /opt/Qt/5.3/gcc/bin/qmake /usr/bin/qmake
or
sudo ln -s /opt/Qt/5.3/gcc/bin/qmake /usr/lib/i386-linux-gnu/qt4/bin/qmake

此時再輸入qmake檢視是否設定成功。

安裝SIP

SIP是python呼叫C/C++庫的必備模組。因此SIP是PyQt的依賴工具,安裝PyQt之前必須先安裝對應版本的SIP。PyQt編譯時使用的SIP版本必須與python預設呼叫的SIP保持一致!否則python中是無法呼叫PyQt的。這裡我們使用最新的SIP 4.16.3.

Ubuntu14.04中貌似是自帶4.15版的SIP(or 自己安裝python擴充套件是自動安裝的)。終端輸入:

sip -V

檢視已安裝SIP版本,如果存在其他版本,請檢視python3的dist-packages目錄下是否存在sip相關檔案。如果存在將其刪除:

sudo -rm /usr/lib/python3/dist-packages/sip*

然後正式安裝SIP 4.16.3。

SIP 4.16.3下載:http://www.riverbankcomputing.com/software/sip/download

安裝過程:

tar -zxvf sip-4.16.3.tar.gz 
cd sip-4.16.3
python3 configure.py
sudo make
sudo make install

配置過程:

SIP無需配置,只是需要安裝完成後注意核對一下版本:

分別在終端輸入:

sip -V

在python3環境輸入:

>>>import sip
>>>print(sip.SIP_VERSION_STR)

檢視二者顯示的版本是否一致。如不一致,需要重新執行上述刪除過程和安裝過程。版本不一致將意味著後面編譯PyQt所使用的SIP和Python3呼叫的SIP的不一致,導致在Python3中呼叫PyQt的相關模組(from PyQt5 import QtCore)出現類似如下錯誤:

the sip module implements API v11.0 but the PyQt5.QtCore module requires API v11.1


安裝PyQt5

PyQt是Python的一個跨平臺圖形開發工具集,是Python與Qt的成功融合。PyQt包含了大約440個類、超過6000個的函式和方法,灰常強大。需要注意的是,Eric(一種Python IDE,依賴PyQt)當前最新的穩定版Eric5只支援PyQt4(確切的說是PyQt4.8以上5.0以下),支援PyQt5的Eric版本現在僅為Eric6.0 snapshot版,該版本包含最新的Eric5的所有功能,但穩定性需要測試。如果你希望使用穩定的Eric5,請在此步驟安裝PyQt4的最新版PyQt4.11.2。這裡我們安裝PyQt5.3.2.

PyQt5.3.2下載:http://www.riverbankcomputing.com/software/pyqt/download5

安裝過程:

tar -zxvf PyQt-gpl-5.3.2.tar.gz
cd PyQt-gpl-5.3.2
python3 configure.py   

注意:此命令生成各種Qt模組後,其中的QtWebKitWidgets模組由於Qt4和Qt5的qprinter.h所屬模組的調整(Qt4存在於QtGui中,Qt5將其調整到QtPrintSupport中了),QtWebKitWidgets的Makefile中缺失了對QtPrintSupport的標頭檔案目錄引用,會導致後面編譯PyQt5時無法找到qprinter.h標頭檔案,編譯失敗(編譯過程非常漫長):

qprinter.h: No such file or directory

所以需要向剛生成的QtWebKitWidgets模組原始檔的MakeFile檔案的INCPATH中新增QtPrintSupport引用。

原INCPATH為:

INCPATH       = -I/opt/Qt/5.3/gcc/mkspecs/linux-g++ -I. -I. -I/usr/include/python3.4m -I/opt/Qt/5.3/gcc/include -I/opt/Qt/5.3/gcc/include/QtWebKitWidgets -I/opt/Qt/5.3/gcc/include/QtWebKit -I/opt/Qt/5.3/gcc/include/QtWidgets -I/opt/Qt/5.3/gcc/include/QtNetwork -I/opt/Qt/5.3/gcc/include/QtGui -I/opt/Qt/5.3/gcc/include/QtCore -I.

修改為:

INCPATH       = -I/opt/Qt/5.3/gcc/mkspecs/linux-g++ -I. -I. -I/usr/include/python3.4m -I/opt/Qt/5.3/gcc/include -I/opt/Qt/5.3/gcc/include/QtWebKitWidgets -I/opt/Qt/5.3/gcc/include/QtWebKit -I/opt/Qt/5.3/gcc/include/QtWidgets -I/opt/Qt/5.3/gcc/include/QtNetwork -I/opt/Qt/5.3/gcc/include/QtPrintSupport -I/opt/Qt/5.3/gcc/include/QtGui -I/opt/Qt/5.3/gcc/include/QtCore -I.

或者可以直接在QtWebKitWidgets模組原始檔的QtWebKitWidgets.pro檔案中加入:

QT += printsupport

也行。

接下來執行編譯安裝:

sudo make 
sudo make install

配置過程:

安裝完成後進入Python3環境驗證是否安裝成功:

>>>import PyQt5

如果提示不存在PyQt5模組,表示安裝的PyQt5沒有被python3正確識別。預設的安裝路徑為python的site-packages目錄。通常python3的模組安裝路徑會分成2個,一個/usr/lib/python3,一個/usr/lib/python3.4,兩個路徑下的模組都能被python3環境正確呼叫,但是python3.4的site-packages目錄下的模組貌似無法呼叫。PyQt5偏偏預設安裝到此目錄了。解決辦法是為其建立軟連線,保險起見,python3目錄和python3.4目錄分別建立一個:

sudo ln -s /usr/lib/python3.4/site-packages/PyQt5 /usr/lib/python3.4/PyQt5
sudo ln -s /usr/lib/python3.4/site-packages/PyQt5 /usr/lib/python3/dist-packages/PyQt5

可能不同的計算機上可識別的模組安裝目錄會存在差異,但是解決原理都差不多,在python3可識別模組的路徑下建立PyQt5的軟連線即可讓Python3成功識別。

另外一個解決辦法是在python3 configure.py  時就指定安裝目錄。如:

python3 configure.py --destdir /usr/lib/python3.4

安裝QScintilla2

QScintilla2是連線編譯器和Python的介面,因此是Eric的必需前置元件。QScintilla2 中需要單獨安裝3個模組:本體,Designer和python bingdings。

QScintilla2.8.4下載:http://www.riverbankcomputing.com/software/qscintilla/download

安裝過程:

tar -xzvf QScintilla-gpl-2.8.4.tar.gz
cd QScintilla-gpl-2.8.4

A.安裝本體:

cd Qt4Qt5
qmake qscintilla.pro
sudo make
make install

B.安裝Designer:

cd ../designer-Qt4Qt5
qmake designer.pro 
sudo make
sudo make install

C.安裝Python bingdings:

cd ../Python
python3 configure.py --pyqt=PyQt5
sudo make
sudo make install
以上步驟即可正確安裝QScintilla2。需要注意的是Python bingdings安裝時需要指定 --pyqt=PyQt5引數,否則預設是為PyQt4安裝。或者直接修改其configure.py,將pyqt5_is_default = False改為pyqt5_is_default = True也可。

配置過程:

無需額外配置。

安裝Eric6

Eric作為一款強大的開源Python IDE,支援Qt介面設計器的Eric在Python GUI開發中更是首屈一指,Python+PyQt+Eric已經成為一種標準的Python GUI開發平臺。其中Eric4支援Python2.6+與PyQt4.6+組合,Eric5支援Python3.0+與PyQt4.8+組合,Eric6支援Python3.0+與PyQt5.0+組合。目前Eric5.4.7為最新穩定版。Eric6.0為snapshot版。上文已有介紹。具體搭配可參考:http://eric-ide.python-projects.org/eric-download.html。這裡安裝Eric6.0.

Eric6.0下載:http://sourceforge.net/projects/eric-ide/files/eric6/unstable/

下載其中的eric6-6.0-snapshot-20140720.tar.gz主檔案和eric6-i18n-zh_CN.GB2312-6.0-snapshot-20140720.tar.gz中文語言包。

安裝過程:

tar -zxvf eric6-6.0-snapshot-20140720.tar.gz
tar -zxvf eric6-i18n-zh_CN.GB2312-6.0-snapshot-20140720.tar.gz     //語言包檔案會自動解壓到Eric6.0主檔案解壓目錄中。沒有的話手動複製。
cd eric6-6.0-snapshot-20140720
sudo python3 install.py           //安裝主程式
sudo python3 install-i18n.py   //安裝中文語言包

應該能夠順利安裝完成。

需要注意,由於是以root身份安裝(sudo),所以執行時需要執行:

sudo eric6

才不會導致Eric執行或者關閉時寫入配置檔案出錯(sudo安裝的Eric6的檔案都是root所有,其他使用者執行Eric6寫入配置檔案時許可權不足)。為了保證直接執行:

eric6

時不致出錯,可以將當前使用者的eric6目錄許可權設定為可讀寫:

sudo chmod a+w -R ~/.eric6
sudo chmod a+w -R ~/.config/Eric6

或者安裝時就直接

python3 install.py  
python3 install-i18n.py

就無需sudo執行了。但是不推薦這樣做。


配置過程:

終端輸入eric6啟動:

1、選擇Settings -> preference -> Editor -> Autocompation。勾選所有選框;


2、選擇Settings -> preference -> Editor -> QScintilla 。勾上左右的兩個選框,然後在下面source中,選擇from Document and API files;


3、選擇Settings -> preference -> Editor -> APIs。勾選Complie APIs Autocompation,在Language中,選擇python3。點面下面的Add from installed APIs按鈕,選擇住需要的.api檔案。最後點選Compile APIs;


4、選擇Settings -> preference -> Interface -> Interface。右側Language根據喜好選擇中文或者English。重啟生效。


配置完成。

Demos

提供2個簡單的Demo驗證平臺是否正確搭建。

A. 非Eric小程式:

#!/usr/bin/env python
from PyQt5.QtWidgets import (QApplication, QLabel)
import sys


if __name__ == "__main__":
    app = QApplication(sys.argv)
    label = QLabel("<center>Hello World with PyQt5!</center>")
    label.resize(200, 50)
    label.show()
    sys.exit(app.exec_())


B. Eric小專案:

此部分轉自:http://www.pythoner.com/89.html

1、新建專案。

點選【專案】-【新建】,彈出如下的對話方塊。建立一個名為demo2的專案。注意,在建立專案時,eric不會自動根據填寫的專案名稱修改專案資料夾名稱!


點選確定之後,可以看到一個原始碼樹中只有__init__.py的專案。另外,eric還建立了幾個檔案,但是並不會在這裡顯示出來,他們分別是專案檔案”pyqtdemo.e4p”和”_eric4project”資料夾。

2、新建窗體。

將左側的【原始碼】選項卡切換至【窗體】選項卡(左數第二個)。右鍵空白區域,選擇【新建窗體】。在彈出的對話方塊中選擇【對話方塊】。在彈出的檔案對話方塊中,選擇檔案位置,並填寫檔名稱。這裡,我們將其命名為demo2.ui。確定後,就可以看到【窗體】選項卡中,有一個demo2.ui檔案了。


3、設計窗體。

右鍵點選“pyqtdemo.ui”檔案,選擇【在Qt設計師中開啟】,就可以在Qt Designer中設計UI介面了。


從圖中可以看到,Qt Designer分為如下幾個部分:

  • 選單欄:包括檔案、編輯、窗體、檢視、設定、視窗和幫助。
  • 工具欄:包括檔案操作、部件前後置、編輯視窗部件、編輯訊號/槽、編輯夥伴、編輯Tab順序、佈局方式、調整大小等。
  • 部件欄:包括各種可用部件。
  • 窗體設計區域
  • 物件檢視器:可以檢視各部件物件關係樹及其所屬的類
  • 屬性編輯器
  • 訊號/槽編輯器
  • 動作編輯器
  • 資源編輯器

3.1、修改窗體屬性

預設的窗體屬性中,objectName(部件名稱,其他程式引用時使用)預設為Dialog,windowTitle(窗體標題)預設也是Dialog。我們可以根據自己的需要,對對話方塊的各個屬性進行修改。這裡,我只修改了windowTitle為“PyQt Demo”,並改變了其大小。

3.2、新增部件

從左側的widget box中拖出3個PushButton,1個label。修改它們的objectName、text等屬性。其中3個PushButton的ObjectName分別為btn1、btn2、btnClose。
新增後的效果圖,如下圖所示:


4、訊號與槽

4.1、概念

在PyQt5中,事件處理的相關術語為“訊號(signal)”和“槽(slot)”。
訊號的含義就是我們常說的事件,比如按鈕被按下、複選框勾選狀態變更、可輸入文字框文字變更等等。
槽的含義則是事件處理函式,比如關閉窗體、隱藏窗體、最大/小化、設定焦點、重繪等。

4.2、使用一個自帶的槽

我們從工具欄中,選擇【編輯訊號/槽】。

拖動要編輯的部件,會出現一個類似於電路中接地符號的標誌,並彈出對話方塊。

這裡,我們選擇clicked(),即按鈕被按下,此時看到右側可選的槽並不多,並且沒有我們希望使用到的關閉功能。


勾選【顯示從QWidget繼承的訊號和槽】,這時可以發現,右側的槽多了很多。在其中找到close(),點選確定。此時,點選【關閉】按鈕執行對話方塊關閉的功能就已經實現了。


下圖是已經建立了【關閉】按鈕槽之後的窗體設計圖。


4.3、第一次執行

雖然只實現了一個關閉功能,但是還是讓我們先來看看如何執行這個到目前為止一行程式碼都沒有寫過的程式吧。
現在回到eric的介面,右鍵“demo2.ui”,選擇【編譯窗體】。

短暫的時間過後,可以看到編譯成功提示。這時,我們切換到【原始碼】選項卡,可以看到一個名為Ui_demo2.py的檔案,這就是根據剛才那個ui檔案自動編譯而成的,我們不需要對其進行任何修改,也不應當對其進行任何修改,因為,任何對這種檔案,在下次編譯後,之前的修改會全部不存在。

看,下圖,就是我們第一次執行時的場景。在eric裡,我們可以F2直接執行,或F5進行除錯。當按下【關閉】的時候,窗體就會被關閉。


4.4、建立自定義槽

使用自帶槽的方式很簡單,然而,它所能實現的功能也是有限的,在我們的開發中,絕大多數訊號發生時,不會使用預設的槽。因此,這一小節將通過按鈕1、2的實現來介紹如何建立一個自定義槽。
自定義槽,就要求自己寫其中的槽函式,而之前的操作中,我們還沒有動手寫過一次程式碼,那麼這個槽的程式碼寫在哪裡呢?
我們再切換回【窗體】選項卡,右鍵demo2.ui,選擇【生成對話方塊程式碼】。
首先,點選【新建】,新建一個類,在這裡可以修改類名、檔名和路徑。

然後在下面的選框中,選擇自己需要使用到的訊號。比如,我的選擇如下圖所示,是兩個按鈕被按下時的訊號:


這時,就生成了一個預設的程式碼。對這個程式碼進行修改,實現預期的內容。


5、完成

修改之後程式碼和執行介面如下:


( 完 )