這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)如何用Python寫(xiě)一個(gè)帶圖形界面的文件壓縮軟件,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名注冊(cè)、雅安服務(wù)器托管、營(yíng)銷軟件、網(wǎng)站建設(shè)、四川網(wǎng)站維護(hù)、網(wǎng)站推廣。
文件壓縮和解壓我們?cè)谌粘9ぷ鲗W(xué)習(xí)中會(huì)經(jīng)常用到,比如winrar、快壓、好壓等壓縮軟件
打開(kāi)之后的界面長(zhǎng)這個(gè)樣子:
壓縮完成后是這個(gè)樣子:
解壓完成后是這個(gè)樣子:
首先不像商業(yè)壓縮軟件,我把功能簡(jiǎn)化了很多,只實(shí)現(xiàn)主要的壓縮(壓縮文件和文件夾)和解壓功能。
Python有一些第三方壓縮和解壓的庫(kù),我選用了zipfile,把文件壓縮為.zip,圖形化選用了pyqt5,因?yàn)橹胺g軟件實(shí)現(xiàn)過(guò)圖形化,所以就偷懶拿過(guò)來(lái)改一下用。
程序的運(yùn)行流程是(對(duì)照上面的圖看):
首先在下拉框選擇是“壓縮”還是“解壓”,然后點(diǎn)擊“選擇“按鈕選擇要執(zhí)行的文件,選擇完成后點(diǎn)擊右下角的“開(kāi)始”按鈕,軟件就開(kāi)始執(zhí)行了。
整個(gè)過(guò)程比較簡(jiǎn)單,主要兩個(gè)地方卡殼了一下,耗了點(diǎn)時(shí)間去解決。
Python壓縮程序第一個(gè)卡殼地方是:
因?yàn)橐獙?shí)現(xiàn)壓縮文件和文件夾的功能,所以當(dāng)點(diǎn)擊圖形界面的”選擇“按鈕時(shí)要支持既能選擇文件,又能選擇文件夾。
但是Qt的QFileDialog不支持這樣的實(shí)現(xiàn),提供的控件要么只能選文件,要么只能選文件夾,對(duì)此花了好幾個(gè)小時(shí)去研究和查閱資料,得出的結(jié)論是要繼承QFileDialog類,然后重寫(xiě)這個(gè)類的部分方法來(lái),實(shí)現(xiàn)既能選文件又能選文件夾的功能,于是趟坑去實(shí)現(xiàn)了一把,對(duì)Qt本身的機(jī)制也是一知半解,所以調(diào)試了很久。
重新實(shí)現(xiàn)的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
第二個(gè)Pyhthon壓縮程序卡殼的地方是:
我把整個(gè)程序都寫(xiě)完了,測(cè)試了幾把沒(méi)有問(wèn)題,自己沾沾自喜這個(gè)程序真完美。第二天又想起了,想再完整的測(cè)試一下,畢竟要寫(xiě)在猿人學(xué)公眾號(hào)上,被人挑刺心里總是不好受的。結(jié)果發(fā)現(xiàn)壓縮時(shí)會(huì)把你的整個(gè)文件路徑上的文件夾都?jí)嚎s進(jìn)去。
舉個(gè)栗子:
比如要壓縮的文件路徑是:D:/log/nginx/access.log
壓縮是:D:/log/nginx/access.zip
解壓后,正常情況應(yīng)該是把文件還原為:
D:/log/nginx/access/access.log
但是實(shí)際上解壓后變成了:
D:/log/nginx/access/log/nginx/access.log
就是程序在壓縮的時(shí)候把文件路徑上的目錄也都?jí)嚎s進(jìn)去了。
這也調(diào)試了好一會(huì),開(kāi)始以為是把文件路徑給傳錯(cuò)了。
結(jié)果是自己對(duì)zipfile的使用沒(méi)研究清楚,錯(cuò)誤示例如下:
z = zipfile.Zipfile('D:/log/nginx/access.zip') z.write('D:/log/nginx/access.log') z.close()
這樣就會(huì)把文件路徑上的目錄全都?jí)嚎s進(jìn)去。正確的用法是:
z = zipfile.Zipfile('D:/log/nginx/access.zip') z.write('D:/log/nginx/access.log','access.log') z.close()
為什么頭一天測(cè)試沒(méi)有發(fā)現(xiàn)這個(gè)問(wèn)題呢?
因?yàn)槲抑皽y(cè)試要壓縮的文件路徑是這樣的:D:/access.log
文件在根目錄下面,文件路徑上沒(méi)有其他目錄了,所以就發(fā)現(xiàn)不了。
這也告訴我們測(cè)試一定要多角度,多場(chǎng)景測(cè)試啊。
兩個(gè)Python源文件,200多行代碼搞定,再一次感嘆用Python就是方便。
一樣可以使用pyinstaller把程序打包成exe文件,就可以把exe文件發(fā)給其他朋友使用了,他們的電腦沒(méi)有Python開(kāi)發(fā)環(huán)境也能運(yùn)行此程序,當(dāng)然為了程序穩(wěn)定,你最好多在幾臺(tái)電腦上測(cè)試一下。
打包命令:
pyinstaller -F -w -i icon.ico transdocx.py
一個(gè)zip_main.py文件(圖形界面),一個(gè)zip_console.py文件(壓縮功能),開(kāi)發(fā)圖形界面程序通常是這樣,把圖形界面部分和業(yè)務(wù)功能部分要分離,相互不干擾,也方便以后修改。
程序運(yùn)行方法:python zip_main.py
1.這個(gè)程序只能壓縮和解壓zip文件,不支持rar、tar。
2.沒(méi)有嚴(yán)格的容錯(cuò)處理
3.不支持加密壓縮和解壓
上述就是小編為大家分享的如何用Python寫(xiě)一個(gè)帶圖形界面的文件壓縮軟件了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。