范例 - 储存文件为压缩档
这篇教学会将 PyQt5 结合 Python 的 zipfile 标准函数库,实作一个能透过界面打开多个文件,并将多个文件压缩为 zip 压缩档的应用功能。
快速导览:
- PyQt6 版本参考:PyQt6 教学 - 打开多个文件,储存为压缩档
- 因为 Google Colab 不支援 PyQt5,所以请使用本机环境 ( 参考:使用 Python 虚拟环境 ) 或使用 Anaconda Jupyter 进行实作 ( 参考:使用 Anaconda )。
在多行输入框里显示文件路径
在画面中加入两个 QPushButton 按钮以及一个 QTextEdit 多行输入框,在点击打开文件的按钮时,使用 QFileDialog 选择文件,并将打开的文件路径加入 fileList 空串列中,最后将串列内容透过换行符合并为文字,由多行输入框显示文字内容。
from PyQt5 import QtWidgets
import sys
import zipfile
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
Form.setWindowTitle('oxxo.studio')
Form.resize(400, 300)
fileList = [] # 建立最後檔案清單
def open():
filePath , filterType = QtWidgets.QFileDialog.getOpenFileNames() # 選擇檔案對話視窗
print(filePath , filterType)
# 如果檔案清單裡沒有開啟的檔案,就將檔案路徑存入清單中
for i in filePath:
if i not in fileList:
fileList.append(i) # 將開啟的檔案添加到輸出清單裡
output = '\n'.join(fileList) # 使用換行符號,合併檔案清單為文字
input.setText(output) # 多行輸入框中顯示文字
btn1 = QtWidgets.QPushButton(Form) # 在 Form 中加入一個 QPushButton
btn1.setText('選擇檔案') # 按鈕文字
btn1.setGeometry(20,5,80,35)
btn1.clicked.connect(open)
input = QtWidgets.QTextEdit(Form) # QTextEdit 多行輸入框
input.setGeometry(20,40,360,240)
input.setLineWrapMode(input.LineWrapMode.NoWrap) # 設定不要自動換行,除非遇到換行符號
Form.show()
sys.exit(app.exec_())
class 写法:
from PyQt5 import QtWidgets
import sys
import zipfile
class MyWidget(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('oxxo.studio')
self.resize(400, 300)
self.ui()
def ui(self):
self.fileList = []
self.btn1 = QtWidgets.QPushButton(self)
self.btn1.setText('選擇檔案')
self.btn1.setGeometry(20,5,80,35)
self.btn1.clicked.connect(self.open)
self.btn2 = QtWidgets.QPushButton(self)
self.btn2.setText('壓縮存檔')
self.btn2.setGeometry(300,5,80,35)
self.input = QtWidgets.QTextEdit(self)
self.input.setGeometry(20,40,360,240)
self.input.setLineWrapMode(self.input.LineWrapMode.NoWrap)
def open(self):
filePath , filterType = QtWidgets.QFileDialog.getOpenFileNames()
print(filePath , filterType)
for i in filePath:
if i not in self.fileList:
self.fileList.append(i)
output = '\n'.join(self.fileList)
self.input.setText(output)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
Form = MyWidget()
Form.show()
sys.exit(app.exec_())
储存为 ZIP 压缩档
加载 zipfile 标准函数库,点击压缩文件的按钮时,根据 fileList 文件清单里的路径,将文件压缩成一个 test.zip 文件。
参考:压缩文件 zipfile
from PyQt5 import QtWidgets
import sys
import zipfile
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
Form.setWindowTitle('oxxo.studio')
Form.resize(400, 300)
fileList = []
def open():
filePath , filterType = QtWidgets.QFileDialog.getOpenFileNames()
print(filePath , filterType)
for i in filePath:
if i not in fileList:
fileList.append(i)
output = '\n'.join(fileList)
input.setText(output)
def zipFile():
zf = zipfile.ZipFile('test.zip', mode='w') # 建立壓縮檔
for i in fileList:
zf.write(i) # 檔案寫入壓縮檔
zf.close() # 關閉壓縮檔
btn1 = QtWidgets.QPushButton(Form)
btn1.setText('選擇檔案')
btn1.setGeometry(20,5,80,35)
btn1.clicked.connect(open)
btn2 = QtWidgets.QPushButton(Form)
btn2.setText('壓縮存檔')
btn2.setGeometry(300,5,80,35)
btn1.clicked.connect(zipFile) # 點擊按鈕時執行壓縮的函式
input = QtWidgets.QTextEdit(Form)
input.setGeometry(20,40,360,240)
input.setLineWrapMode(input.LineWrapMode.NoWrap)
Form.show()
sys.exit(app.exec_())
class 写法:
from PyQt5 import QtWidgets
import sys
import zipfile
class MyWidget(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('oxxo.studio')
self.resize(400, 300)
self.ui()
def ui(self):
self.fileList = []
self.btn1 = QtWidgets.QPushButton(self)
self.btn1.setText('選擇檔案')
self.btn1.setGeometry(20,5,80,35)
self.btn1.clicked.connect(self.open)
self.btn2 = QtWidgets.QPushButton(self)
self.btn2.setText('壓縮存檔')
self.btn2.setGeometry(300,5,80,35)
self.btn2.clicked.connect(self.zipFile)
self.input = QtWidgets.QTextEdit(self)
self.input.setGeometry(20,40,360,240)
self.input.setLineWrapMode(self.input.LineWrapMode.NoWrap)
def open(self):
filePath , filterType = QtWidgets.QFileDialog.getOpenFileNames()
print(filePath , filterType)
for i in filePath:
if i not in self.fileList:
self.fileList.append(i)
output = '\n'.join(self.fileList)
self.input.setText(output)
def zipFile(self):
zf = zipfile.ZipFile('test.zip', mode='w')
for i in self.fileList:
zf.write(i)
zf.close()
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
Form = MyWidget()
Form.show()
sys.exit(app.exec_())
微信扫码关注
抖音扫码关注