На этом шаге мы рассмотрим создание окна для открытия файла.
Окно для открытия одного файла реализуется с помощью статических методов getOpenFileName() и getOpenFileUrl(). Форматы методов:
getOpenFileName([parent=None] [, caption=""] [, directory=""] [, filter=""][, initialFilter=""][, options=0]) getOpenFileUrl([parent=None][, caption=""][, directory=""][, filter=""][, initialFilter=""][, options=0])
В параметре parent указывается ссылка на родительское окно или значение None. Необязательный параметр caption задает текст заголовка окна, параметр directory - текущий каталог, параметр filter - фильтр, параметр initialFilter - фильтр, который будет выбран изначально, а параметр options устанавливает опции (см. описание метода setOption() на 259 шаге). Метод getOpenFileName() возвращает кортеж из двух элементов: первым элементом будет выбранный файл или пустая строка, вторым - выбранный фильтр. Метод getOpenFileUrl() также возвращает кортеж из двух элементов: первый - экземпляр класса QUrl с путем выбранного файла или пустой экземпляр, второй - выбранный фильтр. Пример:
# -*- coding: utf-8 -*- from PyQt5 import QtWidgets, QtCore import sys def on_clicked(): file = QtWidgets.QFileDialog.getOpenFileName(parent=None, caption="Заголовок окна", directory="c:\\Python34", filter="All (*);;py (*.py *.pyw)", initialFilter="py (*.py *.pyw)") fileName = file[0] if fileName != "": lineEdit1.setText(fileName) def on_clicked_url(): file = QtWidgets.QFileDialog.getOpenFileUrl(parent=None, directory="file:///c:\\Python34", filter="All (*);;py (*.py *.pyw)", initialFilter="py (*.py *.pyw)") fileName = file[0].toLocalFile() if fileName != "": lineEdit2.setText(fileName) app = QtWidgets.QApplication(sys.argv) window = QtWidgets.QWidget() # Родительский компонент - окно window.setWindowTitle("Выбор файла") # Назначаем обработчиками функции button1 = QtWidgets.QPushButton("Строка") lineEdit1 = QtWidgets.QLineEdit() button2 = QtWidgets.QPushButton("Url") lineEdit2 = QtWidgets.QLineEdit() grid = QtWidgets.QGridLayout() # Создаем сетку grid.addWidget(button1, 0, 0) # Добавляем компоненты grid.addWidget(lineEdit1, 0, 1) grid.addWidget(button2, 1, 0) grid.addWidget(lineEdit2, 1, 1) button1.clicked.connect(on_clicked) button2.clicked.connect(on_clicked_url) window.setLayout(grid) window.show() sys.exit(app.exec_())
Результат выполнения этого кода показан на рисунках 1, 2.
Рис.1. Использование метода getOpenFileName()
Рис.2. Использование метода getOpenFileUrl()
Окно для открытия сразу нескольких файлов реализуется с помощью статических методов getOpenFileNames() и getOpenFileUrls(). Форматы методов:
getQpenFileNames([parent=None][, caption=""][, directdry=""][, filter=""][, initialFilter=""][, options=0]) getOpenFileUrls([parent=None][, caption=""][, directory=""][, filter=""][, initialFilter=""][, options=0])
Метод getOpenFileNames() возвращает кортеж из двух элементов: первый - список с путями к выбранным файлам или пустой список, второй - выбранный фильтр. Метод getOpenFileUrls() также возвращает кортеж из двух элементов: первый - список экземпляров класса QUrl с путями к выбранным файлам или пустой список, второй - выбранный фильтр. Пример:
# -*- coding: utf-8 -*- from PyQt5 import QtWidgets, QtCore import sys def on_clicked(): arr = QtWidgets.QFileDialog.getOpenFileNames(parent=None, caption="Заголовок окна", directory="c:\\Python34", filter="All (*);;py (*.py *.pyw)", initialFilter="py (*.py *.pyw)") files = arr[0] if files != []: lineEdit1.setText(str(files)) def on_clicked_url(): arr = QtWidgets.QFileDialog.getOpenFileUrls(parent=None, directory="file:///c:\\Python34", filter="All (*);;py (*.py *.pyw)", initialFilter="py (*.py *.pyw)") files = [a.toLocalFile() for a in arr[0]] if files != []: lineEdit2.setText(str(files)) app = QtWidgets.QApplication(sys.argv) window = QtWidgets.QWidget() # Родительский компонент - окно window.setWindowTitle("Выбор файлов") # Назначаем обработчиками функции button1 = QtWidgets.QPushButton("Строка") lineEdit1 = QtWidgets.QLineEdit() button2 = QtWidgets.QPushButton("Url") lineEdit2 = QtWidgets.QLineEdit() grid = QtWidgets.QGridLayout() # Создаем сетку grid.addWidget(button1, 0, 0) # Добавляем компоненты grid.addWidget(lineEdit1, 0, 1) grid.addWidget(button2, 1, 0) grid.addWidget(lineEdit2, 1, 1) button1.clicked.connect(on_clicked) button2.clicked.connect(on_clicked_url) window.setLayout(grid) window.show() sys.exit(app.exec_())
Результат выполнения этого кода показан на рисунках 3, 4.
Рис.1. Использование метода getOpenFileNames()
Рис.2. Использование метода getOpenFileUrls()
На следующем шаге мы рассмотрим окно для сохранения файла.