Resumo : neste tutorial, você aprenderá como usar a QFileDialog
classe 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 QFileDialog
classe 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 QFileDialog
objeto 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 QFileDialog
enum .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 PNG
e :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 OK
botã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 QFileDialog
classe 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_dialog
mé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 QFileDialog
classe 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 QFileDialog
classe. 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
QFileDialog
classe para criar um widget de diálogo de arquivo. - Use o
getOpenFileName()
método estático paraQFileDialog
criar uma caixa de diálogo de arquivo que permite aos usuários selecionar um único arquivo. - Use o
getOpenFileNames()
método estático daQFileDialog
classe 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 daQFileDialog
classe para criar uma caixa de diálogo de arquivo que permite aos usuários selecionar um diretório.