15 個(gè) Python 開源項(xiàng)目,使用 PyQt 做小型桌面應(yīng)用!
△點(diǎn)擊上方“Python貓”關(guān)注 ,回復(fù)“2”加入交流群

【導(dǎo)語】:想制作屬于自己的桌面應(yīng)用程序嗎?這有 15 個(gè)示例帶你手把手入門。
簡介
本次將介紹一個(gè)用 PyQt 框架和 Python 編寫的 15 個(gè)小型桌面應(yīng)用程序的合集。
這其中很多應(yīng)用程序在 learnpyqt 網(wǎng)站[1]上有更詳細(xì)的討論。如果你對(duì)創(chuàng)建GUI應(yīng)用程序還不熟悉,可以查看 pyqt5 入門教程[2]。
這些開源示例在這里:
https://github.com/learnpyqt/15-minute-apps
App列表
這些 app 將展示 Qt 框架的各個(gè)部分,包括高級(jí)小部件、多媒體、圖形視圖和無裝飾窗口。當(dāng)然,最有趣/有特色且功能完整的應(yīng)用是掃雷,紙牌和畫圖。
網(wǎng)絡(luò)瀏覽器[3](無選項(xiàng)卡)-“MooseAche” 網(wǎng)絡(luò)瀏覽器[4](選項(xiàng)卡)-“Mozzarella Ashbacker” 掃雷[5]-“Moonsweeper” 記事本[6]-“No2Pads” 計(jì)算器[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)入那個(gè)app文件夾內(nèi)運(yùn)行以下代碼即可:
shell代碼
pip3 install -r requirements.txt
安裝完之后,即可用python3來執(zhí)行
python3 <filename>.py
應(yīng)用程序的窗口就出現(xiàn)了。
詳細(xì)介紹
1、網(wǎng)絡(luò)瀏覽器(無選項(xiàng)卡)
Mooseache:瀏覽器發(fā)明之初,它會(huì)是什么樣子?
這是一個(gè)用Python和Qt構(gòu)建的web瀏覽器示例。使用Qt5.6中引入的QtWebEngineWidgets系統(tǒng),它提供了一個(gè)帶有常用控件的單窗口瀏覽,以及保存和加載HTML體驗(yàn)的功能。

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

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

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

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

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

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

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

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

你還可以彈出一個(gè)浮動(dòng)在頂部的視頻窗口。

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

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

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

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

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

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

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

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

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

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

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

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

配置選項(xiàng)允許1次發(fā)1張或3張,允許3、5或無限輪。
代碼注釋
卡片處理
這里使用的方法是將每個(gè)可以放置卡片的地方作為一個(gè)“堆棧”對(duì)象來處理它當(dāng)前持有的卡片。每個(gè)堆棧負(fù)責(zé)其堆棧上卡片的布局。
堆棧還負(fù)責(zé)接受/拒絕嘗試在其上放置卡的行為。有些堆棧,如交易堆不接受任何降牌。其他的特殊堆有特定的規(guī)則。
在大多數(shù)情況下,除了底部的“在玩”牌堆外,牌堆上的任何牌都沒有聯(lián)系。底部的卡片具有父子關(guān)系,允許一次拖動(dòng)多張卡片。
結(jié)束動(dòng)畫
最后的結(jié)束動(dòng)畫是獨(dú)立的,并且發(fā)生在比賽時(shí)間之外,所以第一個(gè)想法是有一個(gè)單獨(dú)的假事件循環(huán),使用QApplication.processEvents勾選。但那實(shí)現(xiàn)起來有點(diǎn)惡心。
相反,動(dòng)畫是由QTimer處理的,QTimer通常在播放過程中處于空閑狀態(tài),一旦被觸發(fā)就會(huì)反復(fù)ping一個(gè)動(dòng)畫前進(jìn)投放。這會(huì)移動(dòng)卡片(假裝是“重力”,反彈)以及在它們離開游戲區(qū)域后重新堆疊它們。使用正常的堆疊代碼就可以實(shí)現(xiàn)重新堆疊,這樣它們就可以堆積起來。最后一個(gè)難題是阻止用戶的交互,否則卡片仍然可以被抓取和丟棄。實(shí)現(xiàn)這一點(diǎn)的最簡單方法是在整個(gè)窗口上放置一個(gè)對(duì)象,該對(duì)象被設(shè)置為捕獲(并放棄)所有鼠標(biāo)單擊。
最后,想創(chuàng)建自己的應(yīng)用程序嗎?
如果你覺得這些 app 有些太過簡潔,希望了解更多關(guān)于 PyQt 的信息,請(qǐng)參閱PyQt5 教程[19],它涵蓋了使用PyQt構(gòu)建app從前到后所需的所有知識(shí)。
你也可以在這個(gè)網(wǎng)站上找到關(guān)于這些“小型app”的評(píng)論。
擴(kuò)展
如果你想了解更多,可以移步這里觀看更多的官方示例:https://diagrams.mingrammer.com/docs/getting-started/examples
參考資料
這個(gè)網(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ò)瀏覽器(選項(xiàng)卡): 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]計(jì)算器: 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/

近期熱門文章推薦:
分享與在看是對(duì)我最大的支持!
