15 個開源示例手把手帶你用 PyQt 做小型桌面應(yīng)用
【導(dǎo)語】:想制作屬于自己的桌面應(yīng)用程序嗎?這有 15 個示例帶你手把手入門。
簡介
本次將介紹一個用 PyQt 框架和 Python 編寫的 15 個小型桌面應(yīng)用程序的合集。
這其中很多應(yīng)用程序在 learnpyqt 網(wǎng)站[1]上有更詳細(xì)的討論。如果你對創(chuàng)建GUI應(yīng)用程序還不熟悉,可以查看 pyqt5 入門教程[2]。
這些開源示例在這里:
https://github.com/learnpyqt/15-minute-apps
App列表
這些 app 將展示 Qt 框架的各個部分,包括高級小部件、多媒體、圖形視圖和無裝飾窗口。當(dāng)然,最有趣/有特色且功能完整的應(yīng)用是掃雷,紙牌和畫圖。
網(wǎng)絡(luò)瀏覽器[3](無選項卡)-“MooseAche” 網(wǎng)絡(luò)瀏覽器[4](選項卡)-“Mozzarella Ashbacker” 掃雷[5]-“Moonsweeper” 記事本[6]-“No2Pads” 計算器[7]-“Calculon”(QtDesigner) 文本編輯器[8]-“Megasolid Idiom” 攝像頭/快照[9]-“NSAViewer” 播放器[10]-“Failamp” 便箋[11]-“Brown Note”(QtDesigner) 畫圖[12]-“Piecasso”(QtDesigner) 解壓縮[13]-“7Pez”(QtDesigner) 翻譯[14]-“Translataarrr”(QtDesigner) 天氣[15]-“Raindar”(QtDesigner) 貨幣轉(zhuǎn)換器[16]-“Doughnut”(PyQtGraph) 單人紙牌[17]-“Ronery”(qgraphicscene)
安裝使用
要使用這些app,首先需要安裝requirements文件。在大多數(shù)情況下,唯一要安裝的就是PyQt5,偶爾也要安裝其他依賴。如果要安裝某些app特定的依賴,進(jìn)入那個app文件夾內(nèi)運(yùn)行以下代碼即可:
shell代碼
pip3?install?-r?requirements.txt
安裝完之后,即可用python3來執(zhí)行
python3?.py
應(yīng)用程序的窗口就出現(xiàn)了。
詳細(xì)介紹
1、網(wǎng)絡(luò)瀏覽器(無選項卡)
Mooseache:瀏覽器發(fā)明之初,它會是什么樣子?
這是一個用Python和Qt構(gòu)建的web瀏覽器示例。使用Qt5.6中引入的QtWebEngineWidgets系統(tǒng),它提供了一個帶有常用控件的單窗口瀏覽,以及保存和加載HTML體驗的功能。

2、網(wǎng)絡(luò)瀏覽器(選項卡)
Mozzarella Ashbadger:使用選項卡升級你的瀏覽體驗
Mozarella Ashbacker是網(wǎng)絡(luò)瀏覽領(lǐng)域的最新革命!返回上一頁!打印!保存文件!幫助列表!跟其他瀏覽器一樣的話純屬巧合。

代碼注釋
選項卡
添加選項卡支持使瀏覽器的內(nèi)部結(jié)構(gòu)變復(fù)雜不少,因為我們現(xiàn)在需要跟蹤當(dāng)前活動的瀏覽器視圖,既要更新UI元素(URL欄、HTTPs圖標(biāo))以更改當(dāng)前活動窗口中的狀態(tài),又要確保UI事件被調(diào)度到正確的web視圖。
這是通過使用過濾事件的中間槽和添加信號重定向(使用lamba函數(shù)使其保持簡短)來實現(xiàn)的。
3、掃雷
Moonsweeper:用pyqt來克隆一艘掃雷艇,和外星人在月球上斗智斗勇。
探索神秘的月球,但不要太接近外星土著哦!
Moonsweeper是一款單人益智游戲。游戲的目標(biāo)是探索你著陸的太空火箭周圍的區(qū)域,而不是接近致命的Bug外星人。可信賴的計數(shù)儀會告訴你附近的bug(雷)的數(shù)量。

這是一個簡單的單人探索游戲,模仿掃雷船,你必須在不觸及隱藏的地雷的情況下揭示所有的小方塊。這個小方塊實現(xiàn)是使用定制的QWidget對象,這些對象分別將它們的狀態(tài)保存為mine、status和相鄰的mine計數(shù)。在這個版本中,地雷被外星蟲子(Bug)取代,它們也可能是其他任何東西。

代碼注釋
第一回合設(shè)計
在許多掃雷的變種中,初始回合被認(rèn)為是一個自由回合:如果你在第一次點(diǎn)擊時擊中一枚地雷,它會被移動到其他地方。這里我們投機(jī)取巧了一點(diǎn),讓第一次嘗試確保它是在一個非地雷的地點(diǎn)。這使我們不必?fù)?dān)心第一步走得不好導(dǎo)致需要我們重新計算相鄰。我們把它解釋為“圍繞火箭的初步探索”,讓它聽起來挺合理的。
4、記事本
No2Pads:用PyQt寫的記事本
一個非常簡單的記事本克隆,使用QTextEdit小部件來處理。支持文件加載、保存和打印。

5、計算器
Calculon:用PyQt寫的桌面計算器
一個使用Python在PyQt中實現(xiàn)的簡單計算器應(yīng)用程序。用戶界面是在Qt設(shè)計器中設(shè)計的,計算器操作是使用簡單的基于堆棧的邏輯實現(xiàn)的。

6、文本編輯器
Megasolid-Idiom-用PyQt寫的富文本編輯器
這款編輯器是基于記事本的擴(kuò)展,同樣使用QTextEdit組件 ,但啟用了富文本編輯。
支持多種字體、樣式和段落文本對齊方式。還支持拖放圖像,這些圖像會自動打開并嵌入。
也支持保存和打開HTML格式的文檔。

7、攝像頭
NSAViewer-有人正看著你
使用此攝像頭快照應(yīng)用程序,你可以拍攝攝像頭當(dāng)前正在查看的內(nèi)容的照片。使用QtMultimedia多媒體框架處理與相機(jī)的所有交互,并支持多個攝像頭(如果有的話)。

8、播放器
Failamp-用PyQt打造簡單的播放器
可以聽音頻和看視頻,內(nèi)置播放列表的簡單應(yīng)用程序。使用QtMultimedia和QtMultimediaWidgets處理播放和管理播放列表。
主界面提供了一個播放列表窗口,您可以在其中拖拽要播放的媒體文件。提供了標(biāo)準(zhǔn)媒體控件,以及時間軸部件和音量控件。

你還可以彈出一個浮動在頂部的視頻窗口。

9、便箋
Brown Note—PyQt中的桌面便箋應(yīng)用程序
使用這個浮動筆記應(yīng)用程序在桌面上做臨時筆記。注釋存儲在本地SQLite數(shù)據(jù)庫中。

這個應(yīng)用程序非常簡單,但是演示了在PyQt中創(chuàng)建無裝飾窗口。刪除窗口裝飾會導(dǎo)致不能拖動窗口,因此我們必須自己重新實現(xiàn)這種行為。
10、畫圖
Piecasso-PyQt中的桌面繪畫應(yīng)用程序
用Piecasso來表達(dá)自己吧,唯一一個以派的現(xiàn)成圖片為特色的繪畫程序。Piecasso是windows95中畫圖程序的一個克隆,在此之上做了一些增減。這個程序的特點(diǎn)是有標(biāo)準(zhǔn)的工具,包括鋼筆,刷子,填充,噴霧罐,橡皮擦,文本和一些形狀。

你可以復(fù)制任何形狀的圖像,但不支持粘貼+浮動。畫布的大小是固定的,加載的圖像會根據(jù)需要進(jìn)行調(diào)整。還包括一個圖章工具,其中預(yù)裝了美味派的圖片。

代碼注釋
事件處理
所有工具都是用嵌套的事件處理程序?qū)崿F(xiàn)的,這些處理程序會根據(jù)需要轉(zhuǎn)發(fā)事件。這允許在具有共同行為(例如形狀繪制)的工具之間重復(fù)使用大量代碼。添加選擇區(qū)域動畫需要一個計時器(更新爬行螞蟻),這增加了一些代碼復(fù)雜性。
染色法
從性能的角度來看,這是這個應(yīng)用程序中最棘手的部分。直接檢查像素太慢(整個畫布填充時間約為10秒)。在Python中實現(xiàn)這一點(diǎn)的大多數(shù)代碼都使用numpy,但我不想單獨(dú)為此引入依賴關(guān)系。
通過將圖像導(dǎo)出為bytestring,然后向下采樣到每像素一個布爾字節(jié)(用于匹配/不匹配)來簡化比較循環(huán),可以達(dá)到合理的速度。
雖然這個搜索填充算法仍然相當(dāng)愚蠢。
11、解壓縮
7Pez-有史以來最好/最差的解壓應(yīng)用程序
用一只貓解壓你的文件。將zip文件拖放到懸空喵咪上,填充它手臂處。按下頭部將會解壓縮你的文件到當(dāng)前目錄。
當(dāng)你打開應(yīng)用程序時,貓咪的手臂處是空的。

只需將.zip文件拖放到貓咪上,就可以用文件填充它。

按下貓的頭,文件就會解壓了。
12、翻譯
Translatarrrr-從任何語言到海盜語的即時翻譯
從任何語言翻譯(谷歌翻譯支持)到海盜語。它調(diào)用了遠(yuǎn)程api http://api.funteransations.com 將英語翻譯成海盜語,以及谷歌的一個非官方的Python包裝器將其他語言翻譯成英語。

to English部分使用基于web界面的Python庫,而不是官方API客戶機(jī),因為沒有必要且客戶端是非免費(fèi)的。所以應(yīng)用程序的這一部分不能保證100%工作。

to Pirate部分使用了一個受嚴(yán)重限制的公共API。你大概只能免費(fèi)翻譯5次就被限制了。你可以花錢買一個API密鑰來解除限制。
所以總結(jié)下來,這個程序用處不大。
13、天氣
Raindar-PyQt內(nèi)置的天氣預(yù)報應(yīng)用程序
獲取每日天氣和15小時預(yù)報。數(shù)據(jù)來自免費(fèi)的天氣預(yù)報API https://openweathermap.org/

14、貨幣轉(zhuǎn)換器
Doughnut-用PyQt實現(xiàn)的一個匯率追蹤器
這是一個用PyQt實現(xiàn)的簡單的貨幣匯率跟蹤器,數(shù)據(jù)來自fixer.io[18] API。默認(rèn)設(shè)置顯示前180天的貨幣數(shù)據(jù)。

它會逐步加載數(shù)據(jù),分辨率不斷提高。給定日期的匯率顯示在右側(cè)面板中,并根據(jù)鼠標(biāo)位置進(jìn)行更新。

代碼注釋
數(shù)據(jù)處理
該界面顯示了過去180天的費(fèi)率跟蹤圖(使用PyQtGraph)。由于我們不想向免費(fèi)服務(wù)發(fā)垃圾郵件,所以對API的請求速率被限制為每秒1次,因此完整的數(shù)據(jù)加載時間為180秒(3分鐘)。
為了避免每次等待,我們使用requests_cache方法,它使用本地sqlite數(shù)據(jù)庫來存儲最近請求的結(jié)果。對數(shù)據(jù)的請求使用一種漸進(jìn)的“搜索”方法:如果數(shù)據(jù)中存在缺口,則首先填充中間點(diǎn),并且它更傾向于首先加載最近的時間點(diǎn)。這意味著隨著時間的推移,整個情節(jié)的分辨率會逐漸提高,而不是只提高缺口之后的。
轉(zhuǎn)換
默認(rèn)情況下,應(yīng)用程序檢索的是歐元匯率,并顯示到該基礎(chǔ)貨幣的換算。如果您更改基礎(chǔ)貨幣,它將再次檢索該新貨幣的所有數(shù)據(jù)。這個行為稍微有點(diǎn)愚蠢,因為如果我們有對歐元的匯率,我們可以通過歐元計算任何其他貨幣->貨幣轉(zhuǎn)換(損失一點(diǎn)點(diǎn)準(zhǔn)確性)。
15、單人紙牌
Ronery-PyQt中的紙牌游戲
經(jīng)典的紙牌游戲。游戲跟紙牌在其他方面是相同的,提供相同的選項。它由PyQt構(gòu)建,使用QGraphicsScene來處理游戲區(qū)域。

經(jīng)典紙牌獲勝屏幕也實現(xiàn)了,盡管由于播放畫布不是位圖,所以不會“填滿”。但仍然足夠令人滿意。

配置選項允許1次發(fā)1張或3張,允許3、5或無限輪。
代碼注釋
卡片處理
這里使用的方法是將每個可以放置卡片的地方作為一個“堆棧”對象來處理它當(dāng)前持有的卡片。每個堆棧負(fù)責(zé)其堆棧上卡片的布局。
堆棧還負(fù)責(zé)接受/拒絕嘗試在其上放置卡的行為。有些堆棧,如交易堆不接受任何降牌。其他的特殊堆有特定的規(guī)則。
在大多數(shù)情況下,除了底部的“在玩”牌堆外,牌堆上的任何牌都沒有聯(lián)系。底部的卡片具有父子關(guān)系,允許一次拖動多張卡片。
結(jié)束動畫
最后的結(jié)束動畫是獨(dú)立的,并且發(fā)生在比賽時間之外,所以第一個想法是有一個單獨(dú)的假事件循環(huán),使用QApplication.processEvents勾選。但那實現(xiàn)起來有點(diǎn)惡心。
相反,動畫是由QTimer處理的,QTimer通常在播放過程中處于空閑狀態(tài),一旦被觸發(fā)就會反復(fù)ping一個動畫前進(jìn)投放。這會移動卡片(假裝是“重力”,反彈)以及在它們離開游戲區(qū)域后重新堆疊它們。使用正常的堆疊代碼就可以實現(xiàn)重新堆疊,這樣它們就可以堆積起來。最后一個難題是阻止用戶的交互,否則卡片仍然可以被抓取和丟棄。實現(xiàn)這一點(diǎn)的最簡單方法是在整個窗口上放置一個對象,該對象被設(shè)置為捕獲(并放棄)所有鼠標(biāo)單擊。
最后,想創(chuàng)建自己的應(yīng)用程序嗎?
如果你覺得這些 app 有些太過簡潔,希望了解更多關(guān)于 PyQt 的信息,請參閱PyQt5 教程[19],它涵蓋了使用PyQt構(gòu)建app從前到后所需的所有知識。
你也可以在這個網(wǎng)站上找到關(guān)于這些“小型app”的評論。
擴(kuò)展
如果你想了解更多,可以移步這里觀看更多的官方示例:https://diagrams.mingrammer.com/docs/getting-started/examples
參考資料
這個網(wǎng)站: https://www.learnpyqt.com/apps/
[2]pyqt5入門教程: https://www.learnpyqt.com/courses/start/
[3]網(wǎng)絡(luò)瀏覽器: https://github.com/learnpyqt/15-minute-apps/tree/master/browser
[4]網(wǎng)絡(luò)瀏覽器(選項卡): https://github.com/learnpyqt/15-minute-apps/tree/master/browser_tabbed
[5]掃雷: https://github.com/learnpyqt/15-minute-apps/tree/master/minesweeper
[6]No2Pads: https://github.com/learnpyqt/15-minute-apps/tree/master/notepad
[7]計算器: https://github.com/learnpyqt/15-minute-apps/tree/master/calculator
[8]文字處理器: https://github.com/learnpyqt/15-minute-apps/tree/master/wordprocessor
[9]攝像頭/快照: https://github.com/learnpyqt/15-minute-apps/tree/master/camera
[10]播放器: https://github.com/learnpyqt/15-minute-apps/tree/master/mediaplayer
[11]便箋: https://github.com/learnpyqt/15-minute-apps/tree/master/notes
[12]畫圖: https://github.com/learnpyqt/15-minute-apps/tree/master/paint
[13]解壓縮: https://github.com/learnpyqt/15-minute-apps/tree/master/unzip
[14]翻譯: https://github.com/learnpyqt/15-minute-apps/tree/master/translate
[15]天氣: https://github.com/learnpyqt/15-minute-apps/tree/master/weather
[16]貨幣轉(zhuǎn)換器: https://github.com/learnpyqt/15-minute-apps/tree/master/currency
[17]單人紙牌: https://github.com/learnpyqt/15-minute-apps/tree/master/solitaire
[18]fixer.io: https://fixer.io/
[19]PyQt5教程: https://www.learnpyqt.com/
-?EOF -?
更多優(yōu)秀開源項目(點(diǎn)擊下方圖片可跳轉(zhuǎn))
開源前哨
日常分享熱門、有趣和實用的開源項目。參與維護(hù)10萬+star 的開源技術(shù)資源庫,包括:Python, Java, C/C++, Go, JS, CSS, Node.js, PHP, .NET 等
關(guān)注后獲取
回復(fù)?資源?獲取 10萬+ star 開源資源
分享、點(diǎn)贊和在看
支持我們分享更多優(yōu)秀開源項目,謝謝!



