QFileDialog 选择文件视窗
QFileDialog 是 PyQt6 里负责选择文件的对话视窗元件,通常会搭配按钮或选单进行打开文件的动作,这篇教学会介绍如何在 PyQt6 视窗里加入 QFileDialog 选择文件对话视窗,最后还会使用内建函数 open 搭配 QPlainTextEdit 显示打开文件的内容。
快速导览:
因为 Google Colab 不支援 PyQt6,所以请使用本机环境 ( 参考:使用 Python 虚拟环境 ) 或使用 Anaconda Jupyter 进行实作 ( 参考:使用 Anaconda )。
使用 QFileDialog 选择文件对话视窗
建立 PyQt6 视窗对象后,先透过 QtWidgets.QPushButton(widget) 方法加入按钮,使用 clicked.connect() 绑定点击按钮时的函数,在函数中使用 QtWidgets.QFileDialog.getOpenFileNames() 方法,就可以在点击按钮时,打开选择文件的对话视窗,选择并选择文件后,会回传两个值,第一个值是文件的路径,第二个值则是文件筛选器的类型 ( 默认是 All Files )。
from PyQt6 import QtWidgets
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
Form.setWindowTitle('oxxo.studio')
Form.resize(300, 200)
def open():
filePath , filterType = QtWidgets.QFileDialog.getOpenFileNames() # 選擇檔案對話視窗
print(filePath , filterType)
btn = QtWidgets.QPushButton(Form) # 加入按鈕
btn.move(20, 20)
btn.setText('開啟檔案')
btn.clicked.connect(open)
Form.show()
sys.exit(app.exec())
class 写法:
from PyQt6 import QtWidgets
import sys
class MyWidget(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('oxxo.studio')
self.resize(300, 200)
self.ui()
def ui(self):
self.btn = QtWidgets.QPushButton(self) # 加入按鈕
self.btn.move(20, 20)
self.btn.setText('開啟檔案')
self.btn.clicked.connect(self.open)
def open(self):
filePath , filterType = QtWidgets.QFileDialog.getOpenFileNames() # 選擇檔案對話視窗
print(filePath , filterType)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
Form = MyWidget()
Form.show()
sys.exit(app.exec())
QFileDialog 选择文件的方法
使用 QFileDialog 可以透过三种方式选择文件:
| 方法 | 说明 |
|---|---|
| getOpenFileName() | 选择单一文件。 |
| getOpenFileNames() | 选择多个文件,回传值以串列表示。 |
| getExistingDirectory() | 选择一个文件夹。 |
下方的程序码执行后,会在画面中放入两个按钮,其中一个可以选取多个文件,另外一个可以选取指定的文件夹。
from PyQt6 import QtWidgets
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
Form.setWindowTitle('oxxo.studio')
Form.resize(300, 200)
def openFiles():
filePath, filterType = QtWidgets.QFileDialog.getOpenFileNames() # 選取多個檔案
print(filePath, filterType )
def openFolder():
folderPath = QtWidgets.QFileDialog.getExistingDirectory() # 選取特定資料夾
print(folderPath)
btn1 = QtWidgets.QPushButton(Form)
btn1.move(20, 20)
btn1.setText('開啟檔案')
btn1.clicked.connect(openFiles)
btn2 = QtWidgets.QPushButton(Form)
btn2.move(120, 20)
btn2.setText('開啟資料夾')
btn2.clicked.connect(openFolder)
Form.show()
sys.exit(app.exec())
class 写法:
from PyQt6 import QtWidgets
import sys
class MyWidget(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('oxxo.studio')
self.resize(300, 200)
self.ui()
def ui(self):
self.btn1 = QtWidgets.QPushButton(self)
self.btn1.move(20, 20)
self.btn1.setText('開啟檔案')
self.btn1.clicked.connect(self.openFiles)
self.btn2 = QtWidgets.QPushButton(self)
self.btn2.move(120, 20)
self.btn2.setText('開啟資料夾')
self.btn2.clicked.connect(self.openFolder)
def openFiles(self):
filePath, filterType = QtWidgets.QFileDialog.getOpenFileNames() # 選取多個檔案
print(filePath, filterType )
def openFolder(self):
folderPath = QtWidgets.QFileDialog.getExistingDirectory() # 選取特定資料夾
print(folderPath)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
Form = MyWidget()
Form.show()
sys.exit(app.exec())
QFileDialog 参数设定
使用 QFileDialog 打开文件时,可以设定四个参数:
| 参数 | 说明 |
|---|---|
| parent | 父元件。 |
| caption | 对话视窗标题。 |
| directory | 打开目录 ( 如果没有设定则使用 py 文件所在目录 )。 |
| filter | 文件筛选器,写法参考:TXT (*.txt)。 |
下方的程序码执行后,对话视窗会打开 test 文件夹,并限定只能选择 txt 文件。
from PyQt6 import QtWidgets
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
Form.setWindowTitle('oxxo.studio')
Form.resize(300, 200)
def open():
filename , filetype = QtWidgets.QFileDialog.getOpenFileNames(directory='test', filter='TXT (*.txt)')
print(filename, filetype)
btn = QtWidgets.QPushButton(Form)
btn.move(20, 20)
btn.setText('開啟檔案')
btn.clicked.connect(open)
Form.show()
sys.exit(app.exec())
class 写法:
from PyQt6 import QtWidgets
import sys
class MyWidget(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('oxxo.studio')
self.resize(300, 200)
self.ui()
def ui(self):
self.btn = QtWidgets.QPushButton(self)
self.btn.move(20, 20)
self.btn.setText('開啟檔案')
self.btn.clicked.connect(self.open)
def open(self):
filename , filetype = QtWidgets.QFileDialog.getOpenFileNames(directory='test', filter='TXT (*.txt)')
print(filename, filetype)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
Form = MyWidget()
Form.show()
sys.exit(app.exec())
打开 txt 文件并显示内容
能够取得文件路径后,就能透过 open 内建函数打开文件,并搭配 QPlainTextEdit 多行输入框元件显示打开的文件内容。
from PyQt6 import QtWidgets
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
Form.setWindowTitle('oxxo.studio')
Form.resize(300, 300)
def show():
filePath , filetype = QtWidgets.QFileDialog.getOpenFileName(filter='TXT (*.txt)')
file = open(filePath,'r') # 根據檔案路徑開啟檔案
text = file.read() # 讀取檔案內容
input.setPlainText(text) # 設定變數為檔案內容
file.close() # 關閉檔案
input = QtWidgets.QPlainTextEdit(Form) # 放入多行輸入框
input.move(10,50)
btn = QtWidgets.QPushButton(Form)
btn.move(10, 10)
btn.setText('開啟檔案')
btn.clicked.connect(show)
Form.show()
sys.exit(app.exec())
class 写法 ( 注意不能使用 show 作为方法名称,会覆写基底的 show 方法造成无法显示 ):
from PyQt6 import QtWidgets
import sys
class MyWidget(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('oxxo.studio')
self.resize(300, 300)
self.ui()
def ui(self):
self.input = QtWidgets.QPlainTextEdit(self) # 放入多行輸入框
self.input.move(10,50)
self.btn = QtWidgets.QPushButton(self)
self.btn.move(10, 10)
self.btn.setText('開啟檔案')
self.btn.clicked.connect(self.showText)
def showText(self):
filePath , filetype = QtWidgets.QFileDialog.getOpenFileName(filter='TXT (*.txt)')
file = open(filePath,'r') # 根據檔案路徑開啟檔案
text = file.read() # 讀取檔案內容
self.input.setPlainText(text) # 設定變數為檔案內容
file.close() # 關閉檔案
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
Form = MyWidget()
Form.show()
sys.exit(app.exec())
微信扫码关注
抖音扫码关注