PyQt5——QFileDialog 打开文件对话框

概述

打开文件对话框是为了让用户可以自己选择要打开的文件,在 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)')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知来者逆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值