ython是一種解釋型、面向對象、動態數據類型的高級程序設計語言,Python GUI圖形庫允許Python程序員很方便的創建完整的、功能鍵全的GUI用戶界面。作為Python開發者,你遲早都會用到圖形用戶界面來開發應用,wxPython和PyQt是兩個最受歡迎的Python GUI框架,它們之間有何區別?在實際應用中又該如何選擇呢?
外觀
根據我們的經驗,大多數用戶在使用應用程序時首先關注的一定是應用程序的外觀,所以我們先來比較一下wxPython和PyQt的外觀。
wxPython是Python語言對流行的wxWidgets跨平臺GUI工具庫的綁定。而wxWidgets是用C++語言寫成的,所以在GUI中編寫按鈕小部件的代碼時,不會看到類似于另一個操作系統的東西。
▲基于Linux的Thunar和wxPython
PyQt也是使用C++編寫的,它基于著名的Qt工具包。與wxPython不同的是,它不使用native
widget,而是根據它檢測到操作系統創建小部件的近似值。但是它的近似可以說是做到了極致,就連藝術生基本都分辨不出其與原生有何不同。
如果您使用KDE,可以使用其他PyKDE庫來彌補原始PyQt與Linux和BSD之間Plasma desktop外觀之間的差距,但這增加了新的依賴關系。
▲基于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面板,為每個應用程序提供高度可配置的以可用性為中心的界面。
只要您使用正確的小部件,就可以為用戶提供很多友好的功能,而不必自己去重新思考花哨的技巧。
WxPython具有很多很好的功能,但它在靈活性和用戶控制方面不能和PyQt相提并論,PyQt更易于開發人員設計和布局,在開發Qt之前,要先花費一些時間從用戶獲取跟蹤自定義布局的方法,或者如何找到意外關閉的丟失面板等等。而對于wxPython來說,想要重新打開因意外關閉的面板則是件困難的事情。
總體來說,wxPython畢竟只是wxWidgets的前端,所以如果你真的需要一個功能,你可以用C ++實現它,然后在wxPython中使用它。與PyQt相比,wxPython的學習曲線更加陡峭一些。
通信
GUI應用程序由許多較小的視覺元素組成,通常稱為“小部件”。 為了使GUI應用程序順利運行,小部件必須彼此通信,例如,用于顯示圖像的窗格可以知道用戶選擇了哪個縮略圖。大多數GUI工具包,包括wxPython,都可以處理和“callback”的內部通信。 回調是指向某段代碼(“函數”)的指針。如果您想要點擊某個按鈕小部件時發生某些事情,那么你就要為這個發生的操作編寫函數,當點擊按鈕時,觸發函數,發生操作。
如果它和Lambda表達式結合起來將會產生一個非常靈活的解決方案,達到的效果可能會超過你的預期。
另一方面,Qt以信號/槽機制而聞名。如果您將wxPython的內部通信網絡比喻為舊式電話交換機,那么PyQt的通信則可以視為網狀網絡。
▲在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,增加了大多數應用程序需要的許多便利功能,如頂部的工具欄,底部的狀態欄等。
▲QMainWindow
這是一個使用QMainWindow的小型文本編輯器,只有100多行Python代碼:
wxPython中的基礎小部件是wx.Window。 wxPython中的所有內容都是基于wx.Window類的,無論是實際的窗口還是按鈕,復選框或文本標簽。如果類名寫錯了,wx.Window將直接忽略。
下圖是使用wx.Frame創建一個空的窗口:
將其他小部件放在wx.Frame窗口中,然后構建GUI應用程序。 例如,wx.Panel小部件類似于具有絕對大小約束的HTML中的div,因此您可以使用它在主窗口中創建面板。
與PyQt相比,WxPython具有較少的便捷功能。 例如,復制和粘貼功能是建立在PyQt中的,而在wxPython中必須手工編碼(并且有部分還受其運行的平臺的限制)。
▲WxPython框架
wxPython中的簡單文本編輯器:
你應該使用哪一個呢?
PyQt和wxPython GUI工具包都有自己的優勢。
WxPython在大多數情況下的應用都是比較簡單的,即使在使用過程中出現一些難題,對于Python程序員來說也是很直觀、易于解決的。你不必學習太多的“wxWidget way”實例,它可以將零七碎八的工具包放置在GUI中,如果你定位的用戶空間已安裝GTK,那么wxPython會以最小的依賴關系輕輕松開。
WxPython使用原生小部件使得開發的應用程序與計算機上的應用程序幾乎沒有不同。另外,對于wxPython的跨平臺不要期待太高,它有時會在某些平臺上出現安裝問題,因為它沒有提供多層抽象來屏蔽平臺之間的差異。
PyQt比較大,總是需要安裝一些依賴關系(特別是在非Linux和非BSD中)。沉重的代碼也帶來了很多便利性,Qt幾乎可以完全支持跨平臺,同時也提供了很多預置的功能和部件,這對于依靠Qt作為基礎框架的公司和一些開源項目來說都是非常重要的。
至于WxPython和PyQt到底要選擇哪個,其實是沒有定論的,首先你要看它們的哪些點吸引或者說是吸引了你,其次如果你是一個成熟的程序員,你要可以選擇自己更擅長的,最重要的要根據項目的實際需求來進行選擇。
們在寫一個網站或者一個網頁界面的時候,需要學習很多東西,對小白來說很困難!比如我要做一個簡單的網頁交互:
要懂后端,比如Python里面的Django或者Flask,或者是Java里面的SpringBoot
要懂前端,現在都叫大前端了(因為很復雜),比如前端的框架Vue/React, 然后頁面的美化框架Bootstrap ,還有html ,csss 和Javascript 三駕馬車.
天啊,聽聽頭都大呢!其實我就給老板做一個簡單的交互的頁面,而且我只會Python ,有沒有很簡單的辦法可以做到呢。
今天小編在Github上逛的時候,找到一個非??岬纳衿?,名字叫remi ,目前收獲了2300個贊。
star并不是很多, 但是這個庫可是選入2018年的十大明星庫 ,號稱是一個獨立的GUI庫,而且最牛逼的就是這個庫 竟然小于 100K ,是否很神奇呢,我們一起來體驗一下特性:
跟其他GUI庫區別? Kivy,PyQT和PyGObject都需要主機操作系統的本機代碼,這意味著安裝或編譯大型依賴項。Remi只需要一個Web瀏覽器即可顯示您的GUI。
我需要懂HTML嗎? 不,只需要使用Python進行編碼。
它是開源的嗎? 當然!Remi是根據Apache許可發布的。開源,免費!
我需要某種網絡服務器嗎? 不,自帶網絡服務器。
1、安裝
如何安裝呢,因為是Python 庫,直接用pip 即可
pip install remi
如果是沒有網絡的,或者服務器跟外網不通的,可以離線安裝。下載這個包,然后用install 安裝
python setup.py install
2、快速體驗
我們來快速看一下,這個簡單的Hello world網頁。
這里面包含了一個 2個元素:
點擊這個按鈕還會改變Hello world的文本內容,看點一下就變成了Button pressed.
上面這個簡單的效果,其實只用了20來行Python代碼,都是原生的Python代碼,沒有用一行HTML .
我們來看一下源碼:
整個代碼的結構層次還很清晰的:
init主要是做類的初始化工作;
main主要對這個畫布布局進行設計,包含一個文本和一個按鈕。
on_button_pressed主要是控件的相應,點擊觸發函數
3、更多復雜的網頁元素
看完上面的設計是不是就覺得跟Python里面大名鼎鼎的tk庫很相似啊,上面的只是開胃菜,這個remi還能提供更復雜的gui界面元素。
上面的是一個完整的demo頁面,基本上常見的控件元素的都包含了,比如有菜單欄,文本,按鈕,單選框,進度欄,下拉框,表格,彈出框,按鈕選取文件路徑,文件樹形結構,日期等幾十種控件。
有了這個神器,是不是可以告別Python里面的tk庫,也可以省去學習HTML的時間,還等啥,趕緊下載嘗鮮一下吧。
對Python感興趣或者是正在學習的小伙伴,可以點贊關注收藏支持一波哦, 持續更新中
原文鏈接:https://blog.csdn.net/NNNJ9355/article/details/107319582
你好,今天本文將討論如何在python中創建漂亮的UI應用程序。我知道這聽起來有點奇怪,因為我個人覺得標準Tkinter庫不足以開發出令人驚奇的UI。今天,我們將介紹4種在python中創建現代應用程序的不同方法,因此,讓我們開始,
我們列表中的第一個方法是針對那些了解HTML&CSS的開發人員(如果您不知道,那么我也強烈推薦它),并提供javascript的基礎知識。
基本上,您將使用HTML和CSS開發前端,并用python編寫計算或后端部分。ND鰻魚充當python和javascript之間的橋梁,并傳遞數據。
pip install Eel
└── Folder
├── templates
| ├── index.html
| ├── main.js
| └── style.css
└── main.py
import eel
# name of folder where the html, css, js, image files are located
eel.init('templates')
@eel.expose
def demo(x):
return x**2
# 1000 is width of window and 600 is the height
eel.start('index.html', size=(1000, 600))
function compute() {
var data = document.getElementById("data").value
eel.demo(data)(setValue) // call the demo function which we have created in the main.py file
}
function setValue(res) {
document.getElementById("abc").src = res
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>sample</title>
<link href="style.css" rel="stylesheet">
<script type="text/javascript" src="/eel.js"></script
<script type="text/javascript" src="main.js"></script>
</head>
<body>
<!--
have to call compute() from here for example when user clicks any button or something like that.
-->
</body>
</html>
<https://github.com/ChrisKnott/Eel>
好吧,你一定在想Figma和python之間的組合是什么?Figma是一個UI開發工具,不是用python編寫的庫.嗯!我知道你是對的,但讓我們繼續讀這篇文章吧。
pip install tkdesigner
用戶只需要使用Figma設計一個接口,然后將Figma文件URL和API令牌粘貼到TkinterDesigner中。TkinterDesigner將自動生成在Tkinter中創建GUI所需的所有代碼和圖像。
For complete procedure do watch [this](https://www.youtube.com/watch?v=mFjE2-rbpm8&t=66s&ab_channel=Parthjadhav) video on youtube from Parth Jadhav
https://github.com/ParthJadhav/Tkinter-Designer
Pywebview是一個輕量級的跨平臺包裝器,它支持在自己的原生GUI窗口中顯示HTML內容的webview組件。Pywebview是由羅曼·西羅科夫 .
pip install pywebview
import webview
if __name__ == '__main__':
window = webview.create_window('Load HTML Example', 'index.html')
webview.start(window)
https://github.com/r0x0r/pywebview/
PyQt是在python中開發現代平臺GUI的一個很好的庫。您可以用python編寫代碼來創建應用程序,這可能有點困難,但由于我們正在討論最簡單的方法,您甚至可以使用稱為PyQt5Designer的拖放生成器來創建GUI。通過生成一個.ui文件(即拖放程序)來構建應用程序是一種很好的方法,然后您可以將這個.ui文件轉換為.py文件。
pip install PyQt5Designer
安裝后,設計器將安裝在您的系統中。簡單鍵入designer在您的命令提示符和設計器.exe將彈出。它會看起來像這樣
現在,您可以在畫布中拖放元素。在設計應用程序之后,只需將其導出為.ui文件即可。稍后,您可以將這個.ui文件轉換為.py文件,
pyuic5 -x [NAME_OF_UI_FILE].ui [NAME_OF_PY_FILE].py
原文 Https://dev.to/yash_makan/4-ways-to-create-modern-gui-in-python-in-easiest-way-possible-5e0e
*請認真填寫需求信息,我們會在24小時內與您取得聯系。