定义遍历指定目录下全部文件列表的函数get_files_recursion_from_dir()
def get_files_recursion_from_dir(path):
"""
从指定的文件夹中使用递归的方式,获取全部的文件列表
:param path: 被判断的文件夹
:return: list,包含全部的文件,如果目录不存在或者无文件就返回一个空list
"""
file_list = []
if os.path.exists(path):
for f in os.listdir(path):
new_path = path + "/" + f
if os.path.isdir(new_path):
# 进入到这里,表明这个路径是文件夹不是文件
file_list += get_files_recursion_from_dir(new_path)
else:
name, suf = os.path.splitext(new_path)
if suf == '.pdf':
file_list.append(new_path)
else:
print(f"指定的目录{path},不存在")
return []
return file_list
窗口对象的dragEnterEvent(self, event)中完善如下代码。
def dragEnterEvent(self, event):
file_path = []
for url in event.mimeData().urls():
str_url = str(url.toLocalFile())
if os.path.isdir(str_url):
list_current_all_file = get_files_recursion_from_dir(str_url) # 获取当前目录下所有文件列表,包括子目录
file_path.extend(list_current_all_file)
else:
name, suf = os.path.splitext(str_url)
if suf == '.pdf':
file_path.append(str_url)
for f in file_path:
self.list_filelist.addItem(f) # 将list中每一项添加到列表控件中
拖入“未知尺寸”目录,显示出其中所有文件的列表(包含子目录)。
这里是临时用了一个list控件。
本小节笔记
获取拖拽文件或目录的路径
event.mimeData().urls()返回了一个list,里面包含了所有拖入窗口的目录和文件路径。存在形式:
[PyQt5.QtCore.QUrl('file:///D:/own/pdf尺寸统计工具相关/演示/未知尺寸'), PyQt5.QtCore.QUrl('file:///D:/own/pdf尺寸统计工具相关/演示/1.jpg'), PyQt5.QtCore.QUrl('file:///D:/own/pdf尺寸统计工具相关/演示/新建文本文档.txt')]
最初找到的资料中,event.mimeData().urls()[0]太有局限性了。只给了列表中的第一项。如果每次仅拖入一个文件或一个目录,可以用。它的类型是<class 'PyQt5.QtCore.QUrl'>,用.toLocalFile()得到路径字符串。
list的append()方法和extend()方法
如果当前路径是目录,则需遍历其中子目录得到所有文件,形成一个list_current_all_file列表,列表是常见的可迭代对象之一。在列表尾部一次增加另一个序列的多个值(用新列表扩展原列表),用extend()方法。
file_path.extend(list_current_all_file)
如果当前路径是文件,则取得其后缀名,判断后缀是否是“.pdf”,是pdf文件就将其加入到file_path列表中。追加单个元素到list尾部,用append()
file_path.append(str_url)
os.listdir(path)
返回了当前目录path下所有的文件和目录的名称列表。通过
new_path = path + "/" + f
组合成完整的路径字符串。