Шаг 261.
Библиотека PyQt5.
Диалоговые окна. Класс QFileDialog. Окно для открытия файлов

    На этом шаге мы рассмотрим создание окна для открытия файла.

    Окно для открытия одного файла реализуется с помощью статических методов 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()

    На следующем шаге мы рассмотрим окно для сохранения файла.




Предыдущий шаг Содержание Следующий шаг