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())
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~