App下載

為什么我不推薦你使用tkinter?pyqt——為python GUI開(kāi)發(fā)注入生產(chǎn)力

w3cschool小編 2023-01-31 17:44:02 瀏覽數(shù) (7658)
反饋

想必對(duì)于各位學(xué)習(xí)python的小伙伴都有一顆做出好看的圖形用戶界面的心,因?yàn)槌绦蜃罱K是為人服務(wù)的,只有更好的服務(wù)更多人,才是一個(gè)好程序。而圖形用戶界面就是用來(lái)提升用戶體驗(yàn)的。但是對(duì)于初學(xué)者而言,可能只聽(tīng)過(guò)tkinter,pyqt等圖形用戶界面開(kāi)發(fā)需要的庫(kù),并不了解哪個(gè)好用,為什么好用,我要選擇哪一個(gè)。在早些時(shí)候小編曾經(jīng)參與了tkinter手冊(cè)的整理,當(dāng)時(shí)也對(duì)tkinter表示這個(gè)東西很好用。但自從接觸到pyqt后,我變心了!

回顧——tkinter的優(yōu)與缺

tkinter的優(yōu)點(diǎn)主要是它簡(jiǎn)單無(wú)依賴,作為python標(biāo)準(zhǔn)庫(kù),它不需要依賴其他庫(kù)就能直接使用,但是它也有很顯著的缺點(diǎn):功能少,效果單一,不適合工程化的開(kāi)發(fā),開(kāi)發(fā)的體驗(yàn)也不是很好。

展望——更好用的pyqt

對(duì)于桌面開(kāi)發(fā),天下武功那么多,PyQt 既是最正統(tǒng)的門(mén)派,同時(shí)又是一系列綜合技術(shù)的組合,它進(jìn)可以同 C++ Qt 無(wú)縫整合,解決性能相關(guān)的東西;退又有基于chromium 的 QtWebEngine ,能在適合跑頁(yè)面的部分用 html/js 來(lái)寫(xiě)頁(yè)面,并和 python 雙向調(diào)用,實(shí)現(xiàn)類似 cef/Electron 的效果,但是 Electron這類單一解決方案就只能用 web 技術(shù),想反過(guò)來(lái)同 native 界面混合開(kāi)發(fā),基本就傻了,碰到性能問(wèn)題又不能像 PyQt 那樣可以無(wú)縫切換 C++ Qt,所以龐然大物 Electron 只適合呆在自己的舒適區(qū)。

往左,QtWidgets 可以和傳統(tǒng) C# 的 WinForm pk,往右,Qt-Quick 可以同 WPF/XAML 看齊,因此你可以把 PyQt/Qt看成一系列界面解決方案的 “超集”,所以學(xué)習(xí) PyQt 你學(xué)會(huì)的是綜合格斗術(shù),是名門(mén)正派的內(nèi)功心法,而不是某方向單一的方案,比如 “螳螂拳”。                

PyQt 就是一扇門(mén),它通往的是最專業(yè)的桌面解決方案的世界。

原罪——不好用

tkinter的原罪就是其不好用。怎么說(shuō)呢,作為一個(gè)標(biāo)準(zhǔn)庫(kù),python有提供tkinter的文檔,但這份文檔描述得并不清楚,一旦出現(xiàn)問(wèn)題,你就只能去四處搜索,然后各種找不到,到處找論壇找大佬求助??赡苣苡胻kinter開(kāi)發(fā)出好用的程序的人,只有這個(gè)框架的作者們吧?

另外tkinter還有一些問(wèn)題,比如控件不齊全的問(wèn)題,對(duì)前端頁(yè)面有熟悉的小伙伴應(yīng)該知道有個(gè)東西叫下拉選單,也就是select

簡(jiǎn)單的下拉列表,該用例來(lái)自html教程

這個(gè)功能算是比較常見(jiàn)的一個(gè)功能,結(jié)果tkinter并沒(méi)有內(nèi)置,只有在他的拓展庫(kù)ttk中才有,也就是說(shuō)在學(xué)完tkinter后還需要學(xué)他的拓展庫(kù),了解透徹后才能開(kāi)發(fā)出一個(gè)比較好的應(yīng)用。

還有飽為詬病的一點(diǎn)是其奇怪的參數(shù)傳遞機(jī)制,而且不是很清晰。

這是pyqt的例子

widget.setGeometry(100, 100, 640, 480)

實(shí)現(xiàn)同樣的功能,tkinter的代碼是這樣的:

root.geometry("%dx%d+%d+%d"%(width, height, x, y))

從代碼可讀性而言,tkinter完全比不上pyqt。

再看看這個(gè)例子:

禁用輸入框輸入和按鈕無(wú)法點(diǎn)擊,這是pyqt的例子

widget.setDisabled(True)
widget.setDisabled(False)

而這是tkinter的樣子:

widget.config(state = 'disabled')
widget.config(state = 'normal')

true和false是關(guān)鍵字,在IDE中由于代碼提示,在寫(xiě)代碼的時(shí)候這些參數(shù)能做什么不能做什么都說(shuō)的清清楚楚。而tkinter使用字符串傳參的形式,反而不容易了解。

 正常人的思路是disabled禁止,enable開(kāi)啟(恢復(fù)),沒(méi)想到吧,在這里要恢復(fù)需要使用的是normal!

學(xué)習(xí)——pyqt學(xué)習(xí)起來(lái)真的快

小編有一點(diǎn)點(diǎn)python基礎(chǔ),只用了三十分鐘,就學(xué)會(huì)了簡(jiǎn)單地用pyqt開(kāi)發(fā)一個(gè)密碼生成器,之所以這么快,是因?yàn)閜yqt雖然體系健全,看似復(fù)雜,但與html一樣,實(shí)際上常用的一些插件也就那些,快速掌握這些內(nèi)容就能開(kāi)發(fā)一個(gè)簡(jiǎn)單的gui應(yīng)用程序。

但這不是說(shuō)pyqt只能開(kāi)發(fā)簡(jiǎn)單程序,在復(fù)雜程序上他也能輕松勝任,原因在于他可以把圖形頁(yè)面與邏輯進(jìn)行分離開(kāi)發(fā),這點(diǎn)也是tkinter做不到的。

 pyqt有一個(gè)qt設(shè)計(jì)師,可以直接用來(lái)設(shè)計(jì)界面,而且不需要你會(huì)編程語(yǔ)言,也就是說(shuō)美工可以輕松勝任這個(gè)工作。

學(xué)習(xí)pyqt本站也有提供相應(yīng)的課程

Python GUI編程 PyQt6入門(mén)到實(shí)戰(zhàn)

Python GUI編程 PyQt6入門(mén)到實(shí)戰(zhàn)

小編就是學(xué)習(xí)這個(gè)課程掌握的pyqt6!

小結(jié)——人生苦短,我用qt

在讀完這篇文章后,如果你還愿意使用tkinter,那么你肯定是真愛(ài),而我?人生苦短,我選擇pyqt!

0 人點(diǎn)贊