wxPython和PyQt誰才是最讚的Python GUI庫

weixin_34292287發表於2019-01-28

ython是一種解釋型、物件導向、動態資料型別的高階程式設計語言,Python GUI圖形庫允許Python程式設計師很方便的建立完整的、功能鍵全的GUI使用者介面。作為Python開發者,你遲早都會用到圖形使用者介面來開發應用,wxPython和PyQt是兩個最受歡迎的Python GUI框架,它們之間有何區別?在實際應用中又該如何選擇呢?

外觀

根據我們的經驗,大多數使用者在使用應用程式時首先關注的一定是應用程式的外觀,所以我們先來比較一下wxPython和PyQt的外觀。

進群:700341555獲取Python入門學習資料!

wxPython是Python語言對流行的wxWidgets跨平臺GUI工具庫的繫結。而wxWidgets是用C++語言寫成的,所以在GUI中編寫按鈕小部件的程式碼時,不會看到類似於另一個作業系統的東西。

11897912-06000721ec37f9c0
wxPython和PyQt誰才是最讚的Python GUI庫

▲基於Linux的Thunar和wxPython

PyQt也是使用C++編寫的,它基於著名的Qt工具包。與wxPython不同的是,它不使用native

widget,而是根據它檢測到作業系統建立小部件的近似值。但是它的近似可以說是做到了極致,就連藝術生基本都分辨不出其與原生有何不同。

如果您使用KDE,可以使用其他PyKDE庫來彌補原始PyQt與Linux和BSD之間Plasma desktop外觀之間的差距,但這增加了新的依賴關係。

11897912-0f8692a669ab5b78
wxPython和PyQt誰才是最讚的Python GUI庫

▲基於Linux的KDE和Qt

跨平臺

wxPython和PyQt都支援Linux,Windows和Mac,因此它們都非常適合跨平臺;但是這種跨平臺並不是無條件的,想要你的Python程式碼在特定平臺中執行還需要進行一些調整,如GUI工具包無法將路徑格式調整為資料目錄,因此必須在Python中執行最佳實踐,使用os.path.join和幾個不同的退出方法等等。 GUI工具包的選擇不會從平臺上神奇地抽象出來。

PyQt正在努力的消除跨平臺差異,允許Python本身需要的常見調整。PyQt可以避免大多數跨平臺問題,所以在不同的作業系統中,GUI程式碼基本都可以保持不變。

在wxPython中,使用者可能就需要根據程式設計內容對不同平臺中的GUI程式碼做一些調整。例如,為了防止Microsoft Windows上的某些元素閃爍,USE_BUFFERED_DC屬性必須設定為True才能對圖形進行雙緩衝。這不是預設的,即使可以無條件地對所有平臺進行操作,因此在某些用例中可能存在缺陷。

安裝

作為開發人員,您可能不關心獲取應用程式所需的庫所需的安裝步驟; 但是,如果您計劃分發應用程式,則需要考慮使用者為了使程式執行所必須執行的安裝過程。

在所有平臺上安裝Qt與安裝任何其他應用程式一樣簡單, 給使用者一個下載的連結,然後安裝下載的軟體包即可使用。

PyQt依賴於Qt本身的C ++程式碼,這意味著使用者不僅要安裝PyQt,而且還要安裝所有的Qt。這個操作沒有之前的安裝那麼簡單,但是Qt和PyQt團隊已經儘可能簡化安裝操作了,就現在來看,只要是會安裝瀏覽器或遊戲的使用者,都可以通過連結成功安裝Qt,如果使用者十分擅長,使用者甚至可以將安裝指令碼作為自己的安裝程式的一部分。

在Linux,BSD和Ilumos中,安裝程式通常由經銷商的軟體包管理員為使用者編寫。

在Linux和Windows上,wxPython的安裝過程非常簡單,但在Mac OS上是有問題的。如果可下載的軟體包嚴重過時,Mac OS不利於向後相容。由於存在修復程式的錯誤程式碼,程式包沒有被更新,所以使用者自己找到並實現修補程式的機會很低。現在的解決方案是打包wxPython並將其分發給Mac OS使用者,或者依靠外部程式包管理器。

部件和功能

PyQt和wxPython都具有使用者期望從GUI工具包(包括按鈕,核取方塊,下拉選單等)中獲得的所有常用小部件。 兩者都支援拖放操作,標籤式介面,對話方塊和建立自定義小部件。

PyQt具有靈活性的優點。 您可以在執行時重新排列,浮動,關閉和還原Qt皮膚,為每個應用程式提供高度可配置的以可用性為中心的介面。

11897912-c7bc590f029d4f20
wxPython和PyQt誰才是最讚的Python GUI庫

只要您使用正確的小部件,就可以為使用者提供很多友好的功能,而不必自己去重新思考花哨的技巧。

WxPython具有很多很好的功能,但它在靈活性和使用者控制方面不能和PyQt相提並論,PyQt更易於開發人員設計和佈局,在開發Qt之前,要先花費一些時間從使用者獲取跟蹤自定義佈局的方法,或者如何找到意外關閉的丟失皮膚等等。而對於wxPython來說,想要重新開啟因意外關閉的皮膚則是件困難的事情。

總體來說,wxPython畢竟只是wxWidgets的前端,所以如果你真的需要一個功能,你可以用C ++實現它,然後在wxPython中使用它。與PyQt相比,wxPython的學習曲線更加陡峭一些。

通訊

GUI應用程式由許多較小的視覺元素組成,通常稱為“小部件”。 為了使GUI應用程式順利執行,小部件必須彼此通訊,例如,用於顯示影像的窗格可以知道使用者選擇了哪個縮圖。大多數GUI工具包,包括wxPython,都可以處理和“callback”的內部通訊。 回撥是指向某段程式碼(“函式”)的指標。如果您想要點選某個按鈕小部件時發生某些事情,那麼你就要為這個發生的操作編寫函式,當點選按鈕時,觸發函式,發生操作。

如果它和Lambda表示式結合起來將會產生一個非常靈活的解決方案,達到的效果可能會超過你的預期。

另一方面,Qt以訊號/槽機制而聞名。如果您將wxPython的內部通訊網路比喻為舊式電話交換機,那麼PyQt的通訊則可以視為網狀網路。

11897912-42ee166daf671baa
wxPython和PyQt誰才是最讚的Python GUI庫

▲在Qt的訊號和槽

Qt使用了訊號和槽來代替回撥函式。當一個特定的事件發生時,訊號會被髮送出去。Qt的窗體部件(widget)擁有眾多預先定義好的訊號,當然,我們也可以建立窗體部件(widget)的子類來為它們新增我們需要的自定義訊號。槽,則是對一個特定的訊號進行的反饋。Qt的窗體部件(widget)同樣擁有眾多預先定義好的槽,但是通常的做法是,建立窗體部件(widget)的子類並新增自定義槽,以便對感興趣的訊號進行處理。

訊號和槽機制是型別安全的(type-safe):一個訊號的引數必須和接收槽的引數匹配。由於這種引數匹配機制,編譯器以幫助我們檢查型別不匹配的簽名。訊號與槽是鬆耦合(loosely coupled)的:一個發出訊號的類既不知道也不關心哪一個槽接收到這個訊號。Qt的訊號和槽機制保證瞭如果你將一個訊號連線到一個槽上,槽會在正確的時間以號的引數被呼叫。訊號與槽可以攜帶任意個、任意型別的引數。他們是完全的型別安全。

所有從QObject或者它的一個子類(比如:QWidget)繼承的類都可以使用號與槽。物件中以這種方式通訊:一個物件的狀態發生了改變併傳送訊號,關心這個改變的另一對像接收到這個訊號。傳送訊號的物件並不知道也不感興趣什麼物件接收它所發出的訊號,這是真正的資訊封裝,保證了物件能被當作軟體元件來使用。

槽能被用來接收訊號,除此之外它們也是普通的成員函式。槽不知道是否有訊號與它連線起來,正如物件不知道它發出訊號是否會被接收一樣。這樣的機制確保了可以使用Qt建立一個個完全獨立的元件。

訊號可以與槽進行多對多的連線。就這樣,訊號與插槽建立了強大的元件程式設計機制。

佈局

編寫一個GUI應用程式,首先要做的就是設計佈局,以便將所有視窗小部件都合適的佈局在應用程式視窗中。和設計網頁一樣,你可以調整應用程式的大小,甚至可以將其設定為固定大小。

在Qt中,佈局是十分順利的進行,小部件被明確命名(QPushButton,QDial,QCheckbox,QLabel,甚至QCalendarWidget),並且易於呼叫,甚至連應用文件也很齊全。

這裡大多數的困惑都集中在基礎級的GUI元素中。 例如,如果您正在編寫應用程式,您是否能從QMainWindow或QWidget開始構建您的父視窗?

QWidget是一個空的容器,能被所有其他小部件使用,當然也能放置更多的QWidget來形成放置更多小部件的父視窗。QMainWindow使用QWidget,增加了大多數應用程式需要的許多便利功能,如頂部的工具欄,底部的狀態列等。

11897912-289f643ce32f2f40
wxPython和PyQt誰才是最讚的Python GUI庫

▲QMainWindow

這是一個使用QMainWindow的小型文字編輯器,只有100多行Python程式碼:

11897912-6441c2c184089522
wxPython和PyQt誰才是最讚的Python GUI庫

wxPython中的基礎小部件是wx.Window。 wxPython中的所有內容都是基於wx.Window類的,無論是實際的視窗還是按鈕,核取方塊或文字標籤。如果類名寫錯了,wx.Window將直接忽略。

下圖是使用wx.Frame建立一個空的視窗:

11897912-c9c7e0990a9a6c0b
wxPython和PyQt誰才是最讚的Python GUI庫

將其他小部件放在wx.Frame視窗中,然後構建GUI應用程式。 例如,wx.Panel小部件類似於具有絕對大小約束的HTML中的div,因此您可以使用它在主視窗中建立皮膚。

與PyQt相比,WxPython具有較少的便捷功能。 例如,複製和貼上功能是建立在PyQt中的,而在wxPython中必須手工編碼(並且有部分還受其執行的平臺的限制)。

11897912-453ab5382f6c321d
wxPython和PyQt誰才是最讚的Python GUI庫

▲WxPython框架

wxPython中的簡單文字編輯器:

11897912-fa4eacb334aafffd
wxPython和PyQt誰才是最讚的Python GUI庫

你應該使用哪一個呢?

PyQt和wxPython GUI工具包都有自己的優勢。

WxPython在大多數情況下的應用都是比較簡單的,即使在使用過程中出現一些難題,對於Python程式設計師來說也是很直觀、易於解決的。你不必學習太多的“wxWidget way”例項,它可以將零七碎八的工具包放置在GUI中,如果你定位的使用者空間已安裝GTK,那麼wxPython會以最小的依賴關係輕輕鬆開。

WxPython使用原生小部件使得開發的應用程式與計算機上的應用程式幾乎沒有不同。另外,對於wxPython的跨平臺不要期待太高,它有時會在某些平臺上出現安裝問題,因為它沒有提供多層抽象來遮蔽平臺之間的差異。

PyQt比較大,總是需要安裝一些依賴關係(特別是在非Linux和非BSD中)。沉重的程式碼也帶來了很多便利性,Qt幾乎可以完全支援跨平臺,同時也提供了很多預置的功能和部件,這對於依靠Qt作為基礎框架的公司和一些開源專案來說都是非常重要的。

至於WxPython和PyQt到底要選擇哪個,其實是沒有定論的,首先你要看它們的哪些點吸引或者說是吸引了你,其次如果你是一個成熟的程式設計師,你要可以選擇自己更擅長的,最重要的要根據專案的實際需求來進行選擇。

相關文章