在PyQt5中,你可以使用 QThread
创建多个线程来并行处理每个 U 盘的文件名获取任务。每个线程负责扫描一个 U 盘的文件,同时在主窗口显示结果。以下是一个示例代码,用来创建多个窗口,同时在每个窗口中显示各自的 U 盘文件名:
- 每个窗口使用
QWidget
。 - 使用
QThread
创建后台线程获取 U 盘的文件名,避免主线程卡顿。 - 每个线程负责一个 U 盘,在线程完成时将结果传递回主线程并更新对应窗口。
import sys import os from PyQt5.QtWidgets import (QApplication, QWidget, QVBoxLayout, QLabel, QPushButton) from PyQt5.QtCore import QThread, pyqtSignal class FileScanThread(QThread): # 定义信号,在线程任务完成时发送文件名列表到主线程 file_names_signal = pyqtSignal(list) def __init__(self, drive_path): super().__init__() self.drive_path = drive_path # U 盘路径 def run(self): # 获取 U 盘中的文件名列表 file_names = [] try: for root, dirs, files in os.walk(self.drive_path): for file in files: file_names.append(file) except Exception as e: file_names.append(f"Error: {e}") # 发出信号,传递文件名列表 self.file_names_signal.emit(file_names) class FileWindow(QWidget): def __init__(self, drive_path): super().__init__() self.setWindowTitle(f"U盘文件列表 - {drive_path}") self.setGeometry(300, 300, 400, 300) # 布局和控件 self.layout = QVBoxLayout() self.label = QLabel("文件名加载中...") self.layout.addWidget(self.label) self.setLayout(self.layout) # 启动文件扫描线程 self.scan_thread = FileScanThread(drive_path) self.scan_thread.file_names_signal.connect(self.update_file_names) self.scan_thread.start() def update_file_names(self, file_names): # 更新窗口中的文件名列表 self.label.setText("\n".join(file_names)) class MainApp(QApplication): def __init__(self, usb_drives): super().__init__(sys.argv) self.usb_drives = usb_drives self.windows = [] def create_windows(self): # 为每个 U 盘创建一个窗口 for drive in self.usb_drives: window = FileWindow(drive) window.show() self.windows.append(window) if __name__ == "__main__": # 假设这里有几个 U 盘的挂载路径 usb_drives = ["/path/to/usb1", "/path/to/usb2"] app = MainApp(usb_drives) app.create_windows() sys.exit(app.exec_())
-
FileScanThread
类:继承自QThread
,负责在后台扫描指定 U 盘路径中的文件名,并通过file_names_signal
信号将结果传递回主线程。 -
FileWindow
类:每个窗口负责显示一个 U 盘的文件名列表。窗口会启动一个后台线程FileScanThread
,线程完成后会调用update_file_names
函数更新界面上的文件名。 -
MainApp
类:负责管理多个窗口的创建。传入多个 U 盘路径后,每个 U 盘路径对应一个FileWindow
。