Python PyQt5 QFileDialog 開啟檔案對話框

本篇介紹如何在 Python PyQt5 中開啟檔案對話框,開啟檔案對話框是要讓使用者可以自己選取要開啟的檔案,在 PyQt5 裡要開啟檔案對話框可以使用 QFileDialog,

Python PyQt5 QFileDialog 開啟檔案對話框

Python PyQt5 要叫出開啟檔案對話框要使用 QFileDialog.getOpenFileName(),如果沒有父類視窗 Widget 的話,QFileDialog.getOpenFileName() 第一個引數 Widget 帶入可以使用 None,

python-pyqt-qfiledialog-1.py
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import (QApplication, QFileDialog)

if __name__ == '__main__':
app = QApplication(sys.argv)
filename, filetype = QFileDialog.getOpenFileName(None)
if filename:
print(filename)
print(filetype)

QFileDialog.getOpenFileName() 如果有父類視窗 Widget 的話可以這樣寫,完整的 python 3 使用範例如下,

python-pyqt-qfiledialog-2.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QPushButton, QFileDialog)

class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.initUI()

def initUI(self):
self.setWindowTitle('my window')
self.setGeometry(50, 50, 200, 150)

self.mybutton = QPushButton('button', self)
self.mybutton.move(60, 50)
self.mybutton.clicked.connect(self.onButtonClick)

def onButtonClick(self):
filename, filetype = QFileDialog.getOpenFileName(self)
if filename:
print(filename)
print(filetype)

if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWidget()
w.show()
sys.exit(app.exec_())

接著就把程式執行起來看看吧!程式啟動後會彈出一個開啟檔案的對話框,如下圖所示,

接著選好檔案後,按下OK確定按鈕後 getOpenFileName() 就會回傳檔案路徑與檔案類型了。

PyQt5 QFileDialog 判斷開啟檔案對話框回傳的檔案

通常程式會需要去判斷使用者是否選擇了一個合法的檔案或者是取消動作根本沒選檔案,
這邊示範最簡單的方法是接著判斷檔案是否為空,不為空的話才繼續做接下來的程式邏輯,
QFileDialog.getOpenFileName() 會回傳的兩個 str,若取消的話會回傳兩個空的 str,
判斷 str 不為 empty 的寫法可以用 not 運算子,之前在這篇有介紹過, 這邊我們沒有使用到回傳的 filetype,所以用 _ 不取得這個回傳值,

實際上程式會寫成這樣,

python-pyqt-qfiledialog-3.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QPushButton, QFileDialog)

class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.initUI()

def initUI(self):
self.setWindowTitle('my window')
self.setGeometry(50, 50, 200, 150)

self.mybutton = QPushButton('button', self)
self.mybutton.move(60, 50)
self.mybutton.clicked.connect(self.onButtonClick)

def onButtonClick(self):
filename, _ = QFileDialog.getOpenFileName(self)
if not filename:
print('filename is empty')
else:
with open(filename, 'r') as f:
print(f.read())

if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWidget()
w.show()
sys.exit(app.exec_())

PyQt5 QFileDialog 設定開啟檔案對話框的標題

QFileDialog 想要設定一些提示訊息在開啟檔案對話框的標題,來提示使用者到底要開什麼檔案的話,
可以在 QFileDialog.getOpenFileName() 的第二個引數裡指定顯示的標題,

實際上就會寫成這樣,

python-pyqt-qfiledialog-4.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QPushButton, QFileDialog)

class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.initUI()

def initUI(self):
self.setWindowTitle('my window')
self.setGeometry(50, 50, 200, 150)

self.mybutton = QPushButton('button', self)
self.mybutton.move(60, 50)
self.mybutton.clicked.connect(self.onButtonClick)

def onButtonClick(self):
filename, filetype = QFileDialog.getOpenFileName(self, '開啟檔案')
if filename:
print(filename)
print(filetype)

if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWidget()
w.show()
sys.exit(app.exec_())

也可以用指定 caption 的方式,

1
filename, filetype = QFileDialog.getOpenFileName(self, caption='開啟檔案')

PyQt5 QFileDialog 指定一個初始的目錄來開啟檔案

QFileDialog 通常會有個初始的目錄讓使用者去選,但預設的目錄可能離最終目標的目錄差很多層,這樣使用者要點很多次,很不方便,所以會給一個初始目錄,這邊示範用 os.getcwd() 取得當前目錄,

python-pyqt-qfiledialog-5.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
import os
from PyQt5.QtWidgets import (QApplication, QWidget, QPushButton, QFileDialog)

class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.initUI()

def initUI(self):
self.setWindowTitle('my window')
self.setGeometry(50, 50, 200, 150)

self.mybutton = QPushButton('button', self)
self.mybutton.move(60, 50)
self.mybutton.clicked.connect(self.onButtonClick)

def onButtonClick(self):
filename, filetype = QFileDialog.getOpenFileName(self, '開啟檔案', os.getcwd())
if filename:
print(filename)
print(filetype)

if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWidget()
w.show()
sys.exit(app.exec_())

設定成家目錄的話可以使用 os.path.expanduser('~') 的方式,這方法 Windows 與 Linux 都適用,

1
2
filename, filetype = QFileDialog.getOpenFileName(self, '開啟檔案', 
os.path.expanduser('~'))

你也可以設定一個絕對路徑,這邊示範 /tmp/ 路徑,

1
filename, filetype = QFileDialog.getOpenFileName(self, '開啟檔案', '/tmp/')

也可以用指定參數的寫法,像這樣寫,

1
2
filename, filetype = QFileDialog.getOpenFileName(self, caption='開啟檔案',
directory='C:/')

PyQt5 QFileDialog 設定開啟的檔案類型

假設使用者只想開啟圖片類型的檔案,又不想看到一堆非圖片類型的檔案例如像 .txt 或其他類型,
否則使用者在選擇檔案時會找很慢,所以有些情況下會去設定開啟的檔案類型,這有助於加速使用者開啟檔案,
可以在 QFileDialog.getOpenFileName() 第四個引數裡指定要開啟的檔案類型,範例如下,

python-pyqt-qfiledialog-6.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
import os
from PyQt5.QtWidgets import (QApplication, QWidget, QPushButton, QFileDialog)

class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.initUI()

def initUI(self):
self.setWindowTitle('my window')
self.setGeometry(50, 50, 200, 150)

self.mybutton = QPushButton('button', self)
self.mybutton.move(60, 50)
self.mybutton.clicked.connect(self.onButtonClick)

def onButtonClick(self):
filename, filetype = QFileDialog.getOpenFileName(self, '開啟檔案', os.getcwd(),
'All Files (*);;JPEG Files (*.jpg)')
if filename:
print(filename)
print(filetype)

if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWidget()
w.show()
sys.exit(app.exec_())

如果想開啟文字檔類型的話,可以這樣寫,

1
2
filename, filetype = QFileDialog.getOpenFileName(self, '開啟檔案', os.getcwd(),
'All Files (*);;Text Files (*.txt)')

以上就是 Python PyQt5 QFileDialog 開啟檔案對話框用法與範例介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

其它相關文章推薦

Python 新手入門教學懶人包
Python PyQt5 新手入門教學