PyQt 记住上次打开路径
文件对话窗
功能 | 函数 |
---|---|
打开单个文件 | QFileDialog.getOpenFileName() |
打开多个文件 | QFileDialog.getOpenFileNames() |
打开文件夹 | QFileDialog.getExistingDirectory() |
文件保存 | QFileDialog.getSaveFileName() |
getOpenFileNames
getOpenFileNames函数表示打开多个文件
QtWidgets.QFileDialog.getOpenFileNames(parent=None, caption='', directory='', filter='', initialFilter='', options, QFileDialog_Options=None, QFileDialog_Option=None, *args, **kwargs)
参数 | 描述 |
---|---|
parent | 指定父控件 |
caption | 对话窗的标题 |
directory | 表示对话窗显示的目录,’‘表示程序运行的目录,’/'表示根目录 |
filter | 后缀名过滤器,比如可以只显示txt文件或者mp3文件 |
selectedFilter | 默认选择的过滤器 |
options | 对话框的参数设定 |
思路
控制第三个参数就可以让程序记录上一次目录
因此可以将当前文件的路径保存到一个配置文件中,下次打开程序就读取配置文件获取上一次的路径
保存配置可以使用QSettings(比较方便),另外创建QSettings后要设置编码为UTF8,否则就会出现乱码问题
代码
#coding:utf-8
from PyQt5 import QtCore, QtWidgets, QtGui
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import os
class MainUi(QtWidgets.QMainWindow):
# 界面初始化
def __init__(self, parent=None):
# 导入文件按钮
self.button_load_file = QtWidgets.QPushButton('选择文件', self.main_widget)
# 绑定事件
self.button_load_file.clicked.connect(self.button_load_file_clicked)
# 创建QSettings,配置文件是tmp/.temp
self.setting = QSettings('tmp/.temp', QSettings.IniFormat)
# 设置UTF8编码,反正保存配置文件时出现乱码
self.setting.setIniCodec('UTF-8')
# 读取上一次的目录路径
self.last_path = self.setting.value('LastFilePath')
# 如果字符串为空,将路径索引到根目录
if self.last_path is None:
self.last_path = '/' # 根盘符
# 点击打开文件
def button_load_file_clicked(self):
# 设置过滤器
format_str = ' '.join(['*.pdf'])
# 弹出打开文件的对话窗
fname, _ = QtWidgets.QFileDialog.getOpenFileNames(self, "select pdf", self.last_path, "PDF files (%s)" % (format_str,))
# 如果文件为空,取消后续指令
if fname is None or len(fname) <= 0:
return
try:
#将多个文件转为列表
self.file_path_list = [fname_item for fname_item in fname]
# 保存当前目录的路径到配置文件中,另外如果不存在'tmp/.temp'文件该函数会自动创建
self.setting.setValue('LastFilePath', os.path.dirname(self.file_path_list[0]))
# 将路径设为''程序会使用上一次的路径
self.last_path = ''
except Exception as e:
# 发生异常,弹窗警告
msg = QtWidgets.QMessageBox.warning(self, "Warning", "PDF打开失败%s" % e, buttons=QtWidgets.QMessageBox.Ok, defaultButton=QtWidgets.QMessageBox.Ok)