用Python寫一個帶圖形介面的檔案壓縮軟體

王平發表於2019-03-06

這又是一篇用Python寫小軟體系列,最近有點寫上癮了,檔案壓縮和解壓我們在日常工作學習中會經常用到,比如winrar、快壓、好壓等壓縮軟體,猿人學用Python做個簡易圖形介面的壓縮軟體。

python實現壓縮軟體

 

開啟之後的介面長這個樣子:

python壓縮程式介面

壓縮完成後是這個樣子:

python壓縮程式壓縮完成介面

解壓完成後是這個樣子:

python壓縮程式解壓介面

看到這個介面,閱讀過猿人學之前文章《給寶寶的翻譯小軟體(續):支援PDF啦!》的老朋友應該能認出來,這是在那個翻譯軟體的GUI介面上修改的,哈哈。

 

Python壓縮軟體程式實現和分析過程

首先不像商業壓縮軟體,我把功能簡化了很多,只實現主要的壓縮(壓縮檔案和資料夾)和解壓功能。

Python有一些第三方壓縮和解壓的庫,我選用了zipfile,把檔案壓縮為.zip,圖形化選用了pyqt5,因為之前翻譯軟體實現過圖形化,所以就偷懶拿過來改一下用。

程式的執行流程是(對照上面的圖看):

首先在下拉框選擇是“壓縮”還是“解壓”,然後點選“選擇“按鈕選擇要執行的檔案,選擇完成後點選右下角的“開始”按鈕,軟體就開始執行了。

整個過程比較簡單,主要兩個地方卡殼了一下,耗了點時間去解決。

 

Python壓縮程式第一個卡殼地方是:

因為要實現壓縮檔案和資料夾的功能,所以當點選圖形介面的”選擇“按鈕時要支援既能選擇檔案,又能選擇資料夾。

python壓縮程式FileDialog實現

但是Qt的QFileDialog不支援這樣的實現,提供的控制元件要麼只能選檔案,要麼只能選資料夾,對此花了好幾個小時去研究和查閱資料,得出的結論是要繼承QFileDialog類,然後重寫這個類的部分方法來,實現既能選檔案又能選資料夾的功能,於是趟坑去實現了一把,對Qt本身的機制也是一知半解,所以除錯了很久。

重新實現的QFileDialog類程式碼如下:


class FileDialog(QtWidgets.QFileDialog):
    def __init__(self, *args, **kwargs):
        super(FileDialog, self).__init__(*args, **kwargs)
        self.setOption(QtWidgets.QFileDialog.DontUseNativeDialog, True)
        self.setFileMode(QtWidgets.QFileDialog.ExistingFiles)
        self.tree = self.findChild(QtWidgets.QTreeView)

        self._selFile = ''

    def accept(self):
        inds = self.tree.selectionModel().selectedIndexes()
        self._selFile = os.path.join(str(self.directory().absolutePath()),str(inds[0].data()))
        print('_selfile:',self._selFile)
        self.hide()

    def selectedFiles(self):
        return self._selFile

 

第二個Pyhthon壓縮程式卡殼的地方是:

我把整個程式都寫完了,測試了幾把沒有問題,自己沾沾自喜這個程式真完美。第二天又想起了,想再完整的測試一下,畢竟要寫在猿人學公眾號上,被人挑刺心裡總是不好受的。結果發現壓縮時會把你的整個檔案路徑上的資料夾都壓縮排去。

舉個例子:

比如要壓縮的檔案路徑是:D:/log/nginx/access.log

壓縮是:D:/log/nginx/access.zip

解壓後,正常情況應該是把檔案還原為:

D:/log/nginx/access/access.log

但是實際上解壓後變成了:

D:/log/nginx/access/log/nginx/access.log

就是程式在壓縮的時候把檔案路徑上的目錄也都壓縮排去了。

這也除錯了好一會,開始以為是把檔案路徑給傳錯了。

結果是自己對zipfile的使用沒研究清楚,錯誤示例如下:


z = zipfile.Zipfile('D:/log/nginx/access.zip')
z.write('D:/log/nginx/access.log')
z.close()

這樣就會把檔案路徑上的目錄全都壓縮排去。正確的用法是:


z = zipfile.Zipfile('D:/log/nginx/access.zip')
z.write('D:/log/nginx/access.log','access.log')
z.close()

為什麼頭一天測試沒有發現這個問題呢?

因為我之前測試要壓縮的檔案路徑是這樣的:D:/access.log

檔案在根目錄下面,檔案路徑上沒有其他目錄了,所以就發現不了。

這也告訴我們測試一定要多角度,多場景測試啊。

兩個Python原始檔,200多行程式碼搞定,再一次感嘆用Python就是方便。

 

把Python壓縮程式打包成exe檔案

一樣可以使用pyinstaller把程式打包成exe檔案,就可以把exe檔案發給其他朋友使用了,他們的電腦沒有Python開發環境也能執行此程式,當然為了程式穩定,你最好多在幾臺電腦上測試一下。

打包命令:

pyinstaller -F -w -i icon.ico transdocx.py

 

Python壓縮程式檔案結構:

一個zip_main.py檔案(圖形介面),一個zip_console.py檔案(壓縮功能),開發圖形介面程式通常是這樣,把圖形介面部分和業務功能部分要分離,相互不干擾,也方便以後修改。

程式執行方法:python zip_main.py

Python壓縮程式不足之處

1.這個程式只能壓縮和解壓zip檔案,不支援rar、tar。

2.沒有嚴格的容錯處理

3.不支援加密壓縮和解壓

 

還是一樣,猿人學Python公眾號後臺回覆:壓縮 獲得原始碼。

 

Python小軟體系列閱讀:

用Python寫一個像QQ截圖一樣的應用

用Python給我家寶寶寫個小軟體

 

 

猿人學banner宣傳圖

我的公眾號:猿人學 Python 上會分享更多心得體會,敬請關注。

***版權申明:若沒有特殊說明,文章皆是猿人學 yuanrenxue.com 原創,沒有猿人學授權,請勿以任何形式轉載。***

相關文章