PyQt QFileDialog в Python — выбор файла или каталога на примерах

Класс QFileDialog создает виджет диалогового окна файла в Python, который позволяет пользователям перемещаться по файловой системе и выбирать один или несколько файлов или каталогов.

Содержание

Знакомство с PyQt QFileDialog

Чтобы создать объект диалогового окна файла, необходимо создать новый экземпляр QFileDialog:

dialog = QFileDialog(self)

Объект QFileDialog имеет метод setFileMode(), который позволяет пользователям выбирать существующий файл:

dialog.setFileMode(QFileDialog.FileMode.ExistingFiles)

или файл, который не существует:

dialog.setFileMode(QFileDialog.FileMode.AnyFile)

Эта опция полезна для сценария диалога сохранения файла. См. перечисление QFileDialog.FileMode для полных режимов файла.

Фильтрация типов файлов

Чтобы указать, какие типы файлов пользователи должны выбирать, можно использовать метод setNameFilter(). Например, следующий фильтр ожидает, что пользователи будут выбирать только файлы PNG и JPEG:

dialog.setNameFilter("Images(*.png *.jpg)")

Чтобы использовать несколько фильтров, вам нужно разделить их двумя точками с запятой. Например:

"Images(*.png  *.jpg);;Vector(*.svg)"

Настройка видов для диалоговых файлов

Диалоговое окно файла имеет два режима просмотра: list и detail.

  • В режиме list отображается содержимое текущего каталога в виде списка файлов и имен каталогов.
  • В detail отображается дополнительная информация, такая как размеры файлов и даты изменения.

Чтобы установить режим просмотра, используйте метод setViewMode():

dialog.setViewMode(QFileDialog.Detail)

После завершения настройки вы можете отобразить диалоговое окно файла с помощью метода selectFiles(). Если пользователь нажимает кнопку OK, выбранные файлы помещаются в fileNames:

if dialog.exec_():
    fileNames = dialog.selectedFiles()

Чтобы задать начальный каталог диалога файла, используйте метод setDirectory(). Например:

dialog.setDirectory('C:/images/')

Следующая программа использует файловый диалог, позволяющий пользователям выбирать файлы изображений:

import sys
from PyQt6.QtWidgets import(
    QApplication, 
    QWidget, 
    QFileDialog, 
    QGridLayout,
    QPushButton, 
    QLabel,
    QListWidget
)
from pathlib import Path


class MainWindow(QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.setWindowTitle('PyQt File Dialog')
        self.setGeometry(100, 100, 300, 150)

        layout = QGridLayout()
        self.setLayout(layout)

        # file selection
        file_browser_btn = QPushButton('Browse')
        file_browser_btn.clicked.connect(self.open_file_dialog)

        self.file_list = QListWidget(self)

        layout.addWidget(QLabel('Files:'), 0, 0)
        layout.addWidget(self.file_list, 1, 0)
        layout.addWidget(file_browser_btn, 2 ,0)

        self.show()

    def open_file_dialog(self):
        dialog = QFileDialog(self)
        dialog.setDirectory(r'C:\images')
        dialog.setFileMode(QFileDialog.FileMode.ExistingFiles)
        dialog.setNameFilter("Images(*.png *.jpg)")
        dialog.setViewMode(QFileDialog.ViewMode.List)
        if dialog.exec():
            filenames = dialog.selectedFiles()
            if filenames:
                self.file_list.addItems([str(Path(filename)) for filename in filenames])


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    sys.exit(app.exec())

Выбор одного файла с помощью метода getOpenFileName()

Более лаконично использовать статический метод getOpenFileName() класса QFileDialog для открытия диалога файла. Например:

import sys
from PyQt6.QtWidgets import QApplication, QMainWindow, QFileDialog, QWidget, QGridLayout,QLineEdit,QPushButton, QLabel
from pathlib import Path

class MainWindow(QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.setWindowTitle('PyQt File Dialog')
        self.setGeometry(100, 100, 400, 100)

        layout = QGridLayout()
        self.setLayout(layout)

        # file selection
        file_browse = QPushButton('Browse')
        file_browse.clicked.connect(self.open_file_dialog)
        self.filename_edit = QLineEdit()

        layout.addWidget(QLabel('File:'), 0, 0)
        layout.addWidget(self.filename_edit, 0, 1)
        layout.addWidget(file_browse, 0 ,2)

      
        self.show()


    def open_file_dialog(self):
        filename, ok = QFileDialog.getOpenFileName(
            self,
            "Select a File", 
            "D:\\icons\\avatar\\", 
            "Images(*.png *.jpg)"
        )
        if filename:
            path = Path(filename)
            self.filename_edit.setText(str(path))


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    sys.exit(app.exec())

Выход:

Выбор одного файла

Как это работает.

  • Сначала создадим кнопку и соединим сигнал нажатия с методом open_file_dialog:
file_browse = QPushButton('Browse')
file_browse.clicked.connect(self.open_file_dialog)
  • Во-вторых, определим метод open_file_dialog() и вызовем статический метод getOpenFileName() класса QFileDialog, чтобы открыть диалоговое окно файла:
def open_file_dialog(self):
    filename, _ = QFileDialog.getOpenFileName(
        self,
        "Select a File",
        r"C:\images\",
        "Images(*.png *.jpg)"
    )
    if filename:
        path = Path(filename)
        self.filename_edit.setText(str(path))

Функция getOpenFileName() имеет заголовок «Select a File», начальный каталог — «C:\images\», и ожидает, что пользователи выберут только файл png или jpg.

Метод getOpenFileName() возвращает кортеж. Первый элемент кортежа хранит выбранный путь к файлу. Поскольку второй элемент нам не нужен, мы присваиваем его переменной _.

Выбор нескольких файлов с помощью метода getOpenFileNames()

Чтобы разрешить пользователям выбирать несколько файлов в диалоговом окне, используйте метод getOpenFileNames() вместо метода getOpenFileName().

Функция getOpenFileNames() работает так же, как и функция getOpenFileName(), за исключением того, что первый элемент возвращаемого кортежа содержит список выбранных файлов.

Следующая программа использует метод getOpenFileNames(), чтобы позволить пользователям выбирать несколько файлов, и заполняет виджет списка выбранными именами файлов:

import sys
from PyQt6.QtWidgets import QApplication,  QFileDialog, QWidget, QGridLayout, QListWidget, QPushButton, QLabel
from pathlib import Path


class MainWindow(QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.setWindowTitle('PyQt File Dialog')
        self.setGeometry(100, 100, 400, 100)

        layout = QGridLayout()
        self.setLayout(layout)

        # file selection
        file_browse = QPushButton('Browse')
        file_browse.clicked.connect(self.open_file_dialog)

        self.file_list = QListWidget(self)

        layout.addWidget(QLabel('Selected Files:'), 0, 0)
        layout.addWidget(self.file_list, 1, 0)
        layout.addWidget(file_browse, 2, 0)

        self.show()

    def open_file_dialog(self):
        filenames, _ = QFileDialog.getOpenFileNames(
            self,
            "Select Files",
            r"C:\images\",
            "Images(*.png *.jpg)"
        )
        if filenames:
            self.file_list.addItems([str(Path(filename))
                                     for filename in filenames])


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    sys.exit(app.exec())

Выход:

Выбор нескольких файлов

Выбор каталога

Чтобы открыть диалоговое окно для выбора каталога, используйте метод getExistingDirectory() класса QFileDialog. Например:

import sys
from PyQt6.QtWidgets import QApplication,  QFileDialog, QWidget, QGridLayout, QLineEdit, QPushButton, QLabel
from pathlib import Path


class MainWindow(QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.setWindowTitle('PyQt File Dialog')
        self.setGeometry(100, 100, 400, 100)

        layout = QGridLayout()
        self.setLayout(layout)

        # directory selection
        dir_btn = QPushButton('Browse')
        dir_btn.clicked.connect(self.open_dir_dialog)
        self.dir_name_edit = QLineEdit()

        layout.addWidget(QLabel('Directory:'), 1, 0)
        layout.addWidget(self.dir_name_edit, 1, 1)
        layout.addWidget(dir_btn, 1, 2)

        self.show()

    def open_dir_dialog(self):
        dir_name = QFileDialog.getExistingDirectory(self, "Select a Directory")
        if dir_name:
            path = Path(dir_name)
            self.dir_name_edit.setText(str(path))


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    sys.exit(app.exec())

Выход:

Как открыть диалоговое окно для выбора каталога

Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *