當前位置:
首頁 > 知識 > PyQt5教程 --學習如何創建一個2018年的Python GUI

PyQt5教程 --學習如何創建一個2018年的Python GUI


本教程展示了如何使用PyQt5來構建Python的桌面應用程序。它涵蓋了所有知識,包括在2018年配置PyQt的最佳實踐、如何編譯你的應用程序並將其分發到其他人的電腦上。你可以使用Windows、Mac或Linux。惟一的先決條件是安裝python3(最好是3.5)。




PyQt5是什麼?


PyQt是一個庫,它允許你使用來自Python的Qt GUI框架。Qt本身是用C++編寫。在Python中使用它,你可以更快地構建應用程序,而不會犧牲C++的大部分運行速度。


PyQt5指的是Qt的最新的5版本,你可能仍然會在網上見到(Py)Qt4,但它已經過時了,不再受支持了。


PyQt的一個有趣的新競爭者是Python的Qt。它們的API實際上是相同的。與PyQt不同的是,Qt for Python是在LGPL下獲得許可的,因此可以在商業項目中免費使用。不利的一面是,它並不成熟。我們在本教程中使用PyQt是因為它更穩定。然而,由於Python的Qt API非常相似,所以你可以很容易地將應用程序相互切換。




安裝PyQt


在Python中管理依賴性的最好方法是通過虛擬環境。虛擬環境僅僅是一個本地目錄,其中包含特定項目的庫。與在系統範圍安裝這些庫不同,那樣做將會影響到你的所有項目。


要在當前目錄中創建虛擬環境,請執行以下命令:



這就創建了

venv/

文件夾。要激活Windows上的虛擬環境,運行:



在Mac和Linux上,使用:



你以看到,虛擬環境是通過shell中的(

venv

)前綴激活的:



現在安裝PyQt,發出以下命令:



我們使用版本 

5.9.2

 

是因為不是所有(Py)Qt版本都是一樣穩定的。但是這個版本肯定是沒問題。先不要管其他了——首先要恭喜一下!你已經成功地配置了PyQt5。




創建一個圖形用戶界面


是時候編寫我們的第一個GUI應用了!在虛擬環境仍然活躍的情況下,啟動Python。我們將執行以下命令:


首先,我們告訴

Python

通過

import

語句載入

PyQt


接下來,我們使用以下命令創建

QApplication



這是Qt的一個要求:每個GUI應用程序都必須有一個QApplication的實例。在執行上述命令之前,Qt的部分功能是不起作用的。因此,幾乎每一個你寫的(Py)Qt應用中都需要用到它。


上面一行的 [] 括弧表示傳遞給應用程序的命令行參數。因為我們的應用程序不使用任何參數,所以我們把括弧留空。


現在,為了真正看到一些東西,我們創建了一個簡單的標籤:


然後,我們告訴Qt在屏幕上顯示標籤:



根據你的操作系統,這時應該已經打開了一個小窗口:



最後一步是將控制權交給Qt,並要求它「運行應用程序,直到用戶關閉它」。這是通過以下命令完成的:



 如果所有這些都像預期的那樣工作,那就做得非常好了!你剛剛用Python和Qt構建了第一個GUI應用程序




微件


你在(Py)Qt應用程序中看到的一切都是一個微件:按鈕、標籤、窗口、對話框、進度條等。就像HTML元素一樣,微件通常是嵌套的。例如,一個窗口可以包含一個按鈕,這個按鈕又包含一個標籤。


下面的截圖顯示了最常見的Qt微件:



從上到下,從左到右,它們是:


?QLabel


?QComboBox


?QCheckBox


?QRadioButton


?QPushButton

?QTableWidget


?QLineEdit


?QSlider


?QProgressBar




布局


與上面的例子一樣,你的GUI很可能由多個微件組成。在這種情況下,你需要告訴Qt如何定位它們。例如,你可以使用QVBoxLayout垂直地堆疊微件:



這張截圖的代碼是:



和通常一樣,我們先實例化一個

QApplication

。然後,我們創建一個窗口。我們使用最基本的

QWidget

 

,因為它僅僅是充當一個容器,我們不希望它有任何特殊的行為。接下來,我們創建布局並向其添加兩個

QPushButton

s

。最後,我們告訴窗口使用這個布局(及其內容)。在我們的第一個應用程序中,我們結束了對

.show()

app.exec_()

的調用。


當然也有很多其他類型的布局(例如QHBoxLayout可以在一行中列出項目)。請參閱Qt的文檔概述。




自定義樣式


Qt的優勢之一是它對定製樣式的支持。有許多機制可以讓你自定義應用程序的外觀和感覺。本節概述了一些。




內置的樣式


改變應用程序外觀的最粗略的方法是設置全局樣式。回想一下上面的微件截圖:



它使用了一種稱為

Fusion

的樣式。如果你使用的是

Windows

 

風格,那麼它看起來是這樣的:



要應用樣式,請使用

app.setStyle(...)



可用的樣式取決於你的操作系統,但通常是

"Fusion"

"Windows"

"WindowsVista"

(僅

Windows

)和

"Macintosh"

 

(僅

Mac




自定義顏色


如果你喜歡一種樣式,但想要改變它的顏色(例如 對一個黑暗主題),您可以使用

QPalette

 

app.setPalette(...)

。例如:



這將把按鈕的文本顏色更改為紅色:



對於

Fusion

樣式的黑色主題,請看這裡。




樣式表


除此之外,您還可以通過樣式表更改應用程序的外觀。這是Qt的CSS類比。比如,我們可以這樣來增加一些間距:




有關樣式表的更多信息,請參閱Qt的文檔。




信號/插槽


Qt使用一種稱為信號的機制,讓你對諸如用戶單擊按鈕之類的事件作出反應。下面的例子說明了這一點。它包含一個按鈕,被點擊時,它會顯示一個消息框:




上文高亮顯示的這條線很有趣:

button.clicked

是一個信號,

.connect(...)

讓我們在它上面安裝一個被稱作插槽的東西。這只是一個在信號發生時被調用的函數。在上面的例子中,我們的插槽顯示了一個消息框。


在使用C++時,術語「插槽」是很重要的,因為插槽必須以一種特殊的方式在C++中聲明。然而,在Python中,任何函數都可以是一個插槽——我們已經在上面見識到了。由於這個原因,插槽和「正常」功能之間的區別與我們沒有什麼關係。


信號在Qt中無處不在,當然,你也可以定義自己的信號。然而,這超出了本教程的範圍。




編譯你的應用程序


現在你已經掌握了創建一個響應用戶輸入的GUI的基本知識。假設你寫了一個應用程序,它可以在你的電腦上運行。但是你要如何把它給別人,而且同樣也能運行?


你可以讓你的用戶像我們上面做的那樣安裝Python和PyQt,然後給他們你的源代碼。但這樣非常令人不爽(而且通常是不切實際的)。我們想要的是應用的獨立版本,也就是說,一個二進位可執行文件,其他人可以在他們的系統上運行,並且不需要安裝任何東西。


在Python世界中,將源代碼轉換成一個獨立的可執行文件的過程被稱為凍結。儘管有許多庫解決了這個問題——比如PyInstaller、py2exe、cx_Freeze, bbfreze, py2app 等等——傳統上,凍結PyQt應用一直是一個令人驚訝的難題。


我們將使用一個叫做fbs的新庫,它允許你為PyQt應用程序創建獨立的可執行文件。要安裝它,請輸入以下命令:



 然後,執行以下操作:



 這裡提示你有一些值:



在你輸入run命令後,會打開一個空窗口:



這是一個和我們之前所見完全一樣的PyQt5應用。它的源代碼在你的當前文件目錄下的src/main/python/main.py  中。但這裡有一個很酷的設計:我們可以使用fbs將其轉換為獨立的可執行文件!



這命令會在你的當前文件目錄的target/MyApp/文件夾中放置一個自包含的二進位文件。現在,你可以把它發送給你的朋友(必須是和你一樣的操作系統),這樣他們就可以運行你的應用了!


(請注意,fbs目前的目標是Python 3.5。如果你有一個不同的版本,而且無法正常運行的話,請安裝Python 3.5並再次嘗試。在macOS上,你還可以安裝Python 3.5和Homebrew。)




額外:創建一個安裝程序


fbs還允許你通過命令


為你的應用創建一個安裝程序:




有關如何為現有應用程序使用fbs的更多信息,請參閱本文。或是fbs的教程。




最後總結


如果你已經成功進行到這裡的話,那麼大大的恭喜你。希望你現在已經很好地了解PyQt(以及它的各個部分),學會使用Python編寫桌面應用程序。我們還看到了fbs如何協助你創建獨立的可執行程序和安裝程序。


如果你對本教程有任何問題或反饋,歡迎隨時給我發郵件。盡情享受編寫應用程序帶來的樂趣吧!




英文原文:https://build-system.fman.io/pyqt5-tutorial


譯者:任宇は神様



喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python程序員 的精彩文章:

你可能不知道的10個Python Pandas的技巧和特性(下)
30歲還在敲代碼,等被公司請走嗎?

TAG:Python程序員 |