Home > PyQt5, python > PyQt5: QFileDialog

PyQt5: QFileDialog

9 Aprile 2019

Torna all’indice degli appunti

QFileDialog

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 directory aggiungiamo anche
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_())

Torna all’indice degli appunti

Categorie:PyQt5, python Tag: ,
I commenti sono chiusi.