PyQt5: QFileDialog
Torna all’indice degli appunti
La classe QFileDialog mette a disposizione un dialog dove è possibile selezionare uno o più file o directories, spostarsi nel filesystem, o salvare un file in una determinata posizione. Il classico FileBrowser per intenderci.
OPEN FILE DIALOG
Il metodo più semplice per creare un file-dialog è l’utilizzo del metodo getOpenFileName(parent, caption, directory, filter, options:
Gli argomenti da passare al metodo sono appunto:
parent: il parent del file-dialog;
caption: il titolo del file-dialog;
directory: la directory dove si posizionerà il file-dialog;
filter: i tipi di file (estensioni) che verranno mostrati, filtri myltipli vanno separati dal doppio
options: sono le flags che modificano il comportamento del file-dialog;
options
Le options più importanti sono le seguenti:
ShowDirsOnly: mostra solo le directories e non i files;
DontResolveSymlinks: non risolve i link simbolici nel file-dialog, di default vengono invece risolti;
DontConfirmOverwrite: se un file è esistente, non chiede conferma di sovrascrittura;
DontUseNativeDialog: Non utilizza il fila-dialog nativo;
vediamo qualche esempio:
>>> from PyQt5.QtWidgets import QApplication, QFileDialog >>> app = QApplication([]) fd = QFileDialog() fd.getOpenFileName(parent=None, caption="Open File", directory="", filter="All files (*.*);; Python files (*.py)") ('F:/bancaldo/Qt5/example.py', 'All files (*.*)')
Come si nota, il metodo getOpenFileName ritorna un tupla composta da due stringhe:
una indicante il percorso del file selezionato e l’altra contenente il filtro selezionato nel file-dialog.
Come modificare le options? Mettiamo di non voler utilizzare il file-dialog nativo:
Per impostare le options possiamo utilizzare il metodo setOption(option, bool):
>>> filter = "All files (*.*);; Python files (*.py)" >>> fd.setOption(QFileDialog.DontUseNativeDialog, True) >>> options = fd.options() >>> fd.getOpenFileName(parent=None, caption="Open File", directory="", filter=filter, options=options)
Se vogliamo invece visualizzare solo le directories:
>>> fd.setOption(QFileDialog.ShowDirsOnly, True) >>> options = fd.options() >>> fd.getOpenFileName(parent=None, caption="Open File", directory="", filter=filter, options=options)
Qualora si vollessero modificare più cose, prima schegliere se utilizzare o meno il file-dialog nativo, poi
modificarne il comportamento:
>>> fd.setOption(QFileDialog.DontUseNativeDialog, True) >>> options = fd.options() >>> fd.setOption(QFileDialog.ShowDirsOnly, True) >>> options = fd.options() >>> fd.getOpenFileName(parent=None, caption="Open File", directory="", filter=filter, options=options)
E’ possibile modificare la directory di un file-dialog mediante il metodo setDirectory(path):
>>> fd.setDirectory(r"new_path")
OPEN FILES DIALOG
Le altre modalità di file-dialog, sono ottenute tramite i due metodi getOpenFileNames(parent, caption, directory, filter, options) che, invece di ritornare la stringa del path del file selezionato, ritorna una lista di stringhe di più file selezionati.
Infatti, a differenza del simile getOpenFileName, questo dialog permette la selezione multipla di file.
I parametri da passare al metodo sono gli stessi.
SAVE FILE DIALOG
Altra modalità fondamentale è il Dialog che ci permette di salvare un file.
Si ottiene con il metodo getSaveFileName(parent, caption, directory, filter, options).
Anche in questo caso i parametri del metodo sono sempre quelli, ma se nell’argomento
il nome di un file, questo apparirà direttamente nel dialog:
>>> fd.getSaveFileName(parent=None, caption="Save File", directory="example.doc", filter=filter, options=options)
DIRECTORY DIALOG
Permettere di selezionare una directory e non un file, tramite il metodo getExistingDirectory(parent, caption, directory, options), che ritorna la stringa della directory selezionata. In sostanza è come il getOpenFileName con settata la option ShowDirsOnly.
URLs
E’ possibile ottenere dai dialog anche le url complete delle selezioni, utilizzando i corrispettivi metodi:
getOpenFileNameUrl:
ritorna una tupla con un oggetto QUrl con l’url completo del file selezionato ed una stringa del filtro utilizzato
>>> fd.getOpenFileUrl(parent=None, caption="", directory="", options=options) (PyQt5.QtCore.QUrl('file:///C:/bancaldo/Qt5/example.txt'), 'All Files (*)')
>>> url = fd.getOpenFileUrl(parent=None, caption=””, directory=””, options=options)[0]
>>> url.url()
‘file:///C:/bancaldo/Qt5/example.txt’
[/code]
getOpenFileUrls:
Come sopra ma otterremo una lista di oggetti QUrl rappresentanti i file selezionati nel dialog:
>>> urls = fd.getOpenFileUrls(parent=None, caption="", directory="", options=options)[0] >>> for url in urls: ... print(url.url()) ... file:///C:/bancaldo/Qt5/example.txt file:///C:/bancaldo/Qt5/example2.txt
getSaveFileNameUrl:
Ritorna l’url del file da salvare:
>>> url = fd.getSaveFileUrl(parent=None, caption="", directory="", options=options)[0] >>> url.url() 'file:///F:/bancaldo/Qt5/example3.txt'
getExistingDirectoryUrl:
Ritorna l’url della directory selezionata, attenzione all’oggetto QUrl richiesto nell’argomento directory!
>>> url = fd.getExistingDirectoryUrl(parent=None, caption="", directory=QUrl(), options=options) >>> url.url() 'file:///F:/bancaldo/Qt5'
[/code]
Ecco un esempio pratico di utilizzo di un file-dialog:
import sys from PyQt5.QtWidgets import (QApplication, QWidget, QTextEdit, QPushButton, QFileDialog, QMainWindow, QVBoxLayout) class MainWindow(QMainWindow): def __init__(self): super(MainWindow, self).__init__() self.setWindowTitle("QFileDialog example") self.central_widget = FileDialogWidget(self) self.setCentralWidget(self.central_widget) self.resize(400, 150) class FileDialogWidget(QWidget): def __init__(self, parent): super(FileDialogWidget, self).__init__(parent) self.layout = QVBoxLayout(self) self.file_label = QTextEdit() button_open_file = QPushButton("Browse single file") button_open_files = QPushButton("Browse multiple file") button_save = QPushButton("Save") self.setLayout(self.layout) self.layout.addWidget(self.file_label) self.layout.addWidget(button_open_file) self.layout.addWidget(button_open_files) self.layout.addWidget(button_save) button_open_file.clicked.connect(self.on_open_single_file) button_open_files.clicked.connect(self.on_open_multi_files) button_save.clicked.connect(self.on_save_file) def on_open_single_file(self): file_name = QFileDialog.getOpenFileName( parent=self, caption="Open file dialog", directory="", filter="All Files (*);;Python Files (*.py)")[0] if file_name: self.file_label.setText("Open file:\n%s" % file_name) def on_open_multi_files(self): text = "Open files:\n" files = QFileDialog.getOpenFileNames( parent=self, caption="Open files dialog", directory="", filter="All Files (*);;Python Files (*.py)")[0] if files: # files è ina lista di stringhe! for file_path in files: text += "%s\n" % file_path self.file_label.setText(text) def on_save_file(self): file_name = QFileDialog.getSaveFileName( parent=self, caption="Save file dialog", directory="", filter="All Files (*);;Python Files (*.py)")[0] if file_name: self.file_label.setText("Save file:\n%s" % file_name) if __name__ == '__main__': app = QApplication(sys.argv) main_window = MainWindow() main_window.show() sys.exit(app.exec_())
Commenti recenti