概述
打开文件对话框是为了让用户可以自己选择要打开的文件,在 PyQt5 里要打开文件对话框可以使用 QFileDialog。
无父类窗口
Python PyQt5 打开文件对话框要使用 QFileDialog.getOpenFileName(),如果没有父类 Widget 的话,QFileDialog.getOpenFileName() 第一个参数 Widget 可以带 None。
#!/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 的话可使用代码如下:
#!/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 不为空的写法可以用 not 运算符,之前在这篇有介绍过,这边我们没有使用到返回的 filetype,所以用 _ 不取得这个返回值,
#!/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_())
设置对话框的标题
QFileDialog 想要设置一些提示信息在打开文件对话框的标题,来提示用户到底要开什么文件的话,可以在 QFileDialog.getOpenFileName() 的第二个参数里指定显示的标题,
#!/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 的方式,
filename, filetype = QFileDialog.getOpenFileName(self, caption='打开文件')
指定默认打开目录
QFileDialog 指定一个初始的目录来打开文件,QFileDialog 通常会有一个初始的目录让用户去选,但默认的目录可能离最终目标的目录很多层,这样用户要点很多次,很不方便,所以会给一个初始目录,可以使用范用 os.getcwd() 取得当前目录:
#!/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 都适用,
self,
'打开文件',
os.
path.expanduser(
~
))
也可以设定一个绝对路径,这边示范 /tmp/ 路径,
filename, filetype = QFileDialog.getOpenFileName(self,
'打开文件',
'/tmp/')
也可以用指定参数的写法,像这样写,
filename, filetype = QFileDialog.getOpenFileName(self, caption='打开文件', directory='C:/')
文件 类型
假设用户只想打开图片类型的文件,又不想看到一堆非图片类型的文件案例如 .txt 或其他类型,否则用户在选择文件时会找很慢,所以有些情况下会去设置打开的文件类型,这有助于加速用户打开文件,可以在 QFileDialog.getOpenFileName() 第四个参数里指定要打开的文件类型:
#!/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_())
如果想打开文档类型的文件 :
filename, filetype = QFileDialog.getOpenFileName(self, '打开文件', os.getcwd(),
'All Files (*);;Text Files (*.txt)')