PyQt QFileDialog

Resumo : neste tutorial, você aprenderá como usar a QFileDialogclasse PyQt para criar caixas de diálogo de arquivos que permitem aos usuários selecionar arquivos ou diretórios do sistema de arquivos.

Introdução ao PyQt QFileDialog

A QFileDialogclasse cria um widget de diálogo de arquivo que permite aos usuários percorrer o sistema de arquivos e selecionar um ou mais arquivos ou um diretório.

Para criar um objeto de diálogo de arquivo, você cria uma nova instância de QFileDialog:

dialog = QFileDialog(self)Linguagem de código:  Python  ( python )

O QFileDialogobjeto possui o setFileMode()método que permite aos usuários selecionar um arquivo existente:

dialog.setFileMode(QFileDialog.FileMode.ExistingFiles)Linguagem de código:  Python  ( python )

ou um arquivo que não existe:

dialog.setFileMode(QFileDialog.FileMode.AnyFile)Linguagem de código:  Python  ( python )

Esta opção é útil para o cenário de diálogo Salvar como arquivo. Consulte o QFileDialogenum .FileMode para obter os modos de arquivo completos.

Filtrando tipos de arquivo

Para especificar quais tipos de arquivos os usuários devem selecionar, você pode usar o setNameFilter()método. Por exemplo, o filtro a seguir espera que os usuários selecionem apenas arquivos PNGe :JPEG

dialog.setNameFilter("Images (*.png *.jpg)")Linguagem de código:  Python  ( python )

Para usar vários filtros, você precisa separar cada um com dois pontos e vírgulas. Por exemplo:

"Images (*.png  *.jpg);;Vector (*.svg)"Linguagem de código:  Python  ( python )

Configurando visualizações para caixas de diálogo de arquivo

A caixa de diálogo do arquivo possui dois modos de visualização: lista e detalhe.

  • A visualização de lista mostra o conteúdo do diretório atual como uma lista de arquivos e nomes de diretórios
  • A visualização detalhada exibe informações adicionais, como tamanhos de arquivo e datas de modificação.

Para definir o modo de visualização, você usa o setViewMode()método:

dialog.setViewMode(QFileDialog.Detail)Linguagem de código:  Python  ( python )

Depois de concluir a configuração, você pode mostrar a caixa de diálogo do arquivo usando o selectFiles()método. Se o usuário clicar no OKbotão, os arquivos selecionados serão colocados em fileNames:

if dialog.exec_():
    fileNames = dialog.selectedFiles()Linguagem de código:  Python  ( python )

Para definir o diretório inicial da caixa de diálogo do arquivo, você usa o setDirectory()método. Por exemplo:

dialog.setDirectory('C:/images/')Linguagem de código:  Python  ( python )

O programa a seguir usa uma caixa de diálogo de arquivo que permite aos usuários selecionar arquivos de imagem:

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())Linguagem de código:  Python  ( python )

Selecionando um único arquivo usando o método getOpenFileName()

É mais conciso usar o método estático getOpenFileName()da QFileDialogclasse para abrir a caixa de diálogo de arquivo. Por exemplo:

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())Linguagem de código:  Python  ( python )

Saída:

Como funciona.

Primeiro, crie um botão e conecte o sinal clicado ao open_file_dialogmétodo:

file_browse = QPushButton('Browse')
file_browse.clicked.connect(self.open_file_dialog)Linguagem de código:  Python  ( python )

Segundo, defina o open_file_dialog()método e chame o getOpenFileName()método estático da QFileDialogclasse para abrir uma caixa de diálogo de arquivo:

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))Linguagem de código:  Python  ( python )

O getOpenFileName()tem o título “Selecionar um arquivo”, iniciando o diretório como “C:\images\”, e espera que os usuários selecionem apenas um arquivo png ou jpg.

O getOpenFileName()método retorna uma tupla. O primeiro elemento da tupla armazena o caminho do arquivo selecionado. Como não precisamos do segundo elemento, atribuímos-o à variável _.

Selecionando vários arquivos usando o método getOpenFileNames()

Para permitir que os usuários selecionem vários arquivos em uma caixa de diálogo de arquivo, use o getOpenFileNames()método em vez do getOpenFileName()método.

Funciona getOpenFileNames()como getOpenFileName()exceto que o primeiro elemento da tupla retornada contém uma lista dos arquivos selecionados.

O programa a seguir usa o getOpenFileNames()método para permitir que os usuários selecionem vários arquivos e preencham um widget de lista com os nomes dos arquivos selecionados:

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())Linguagem de código:  Python  ( python )

Saída:

Selecionando um diretório

Para abrir uma caixa de diálogo de arquivo para selecionar um diretório, você usa o getExistingDirectory()método da QFileDialogclasse. Por exemplo:

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())Linguagem de código:  Python  ( python )

Saída:

Resumo

  • Uma caixa de diálogo de arquivo permite selecionar um ou mais arquivos ou um diretório.
  • Use a QFileDialogclasse para criar um widget de diálogo de arquivo.
  • Use o getOpenFileName()método estático para QFileDialogcriar uma caixa de diálogo de arquivo que permite aos usuários selecionar um único arquivo.
  • Use o getOpenFileNames()método estático da QFileDialogclasse para criar uma caixa de diálogo de arquivo que permite aos usuários selecionar vários arquivos.
  • Use o getExistingDirectory()método estático da QFileDialogclasse para criar uma caixa de diálogo de arquivo que permite aos usuários selecionar um diretório.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *