Как сделать так, чтобы приложение запрашивало как назвать и куда поместить получившийся файл?

Как сделать так, чтобы приложение после нажатия на кнопку convert запрашивало выбор директории для сохранения получившегося файла, а также, была возможность указать имя при сохранении?

class Convert_App(QtWidgets.QMainWindow, ui_window.Ui_MainWindow):
def __init__(self):
    super().__init__()
    self.setupUi(self)

    self.directory = None

    self.btn_choose.clicked.connect(self.choose)
    self.btn_convert.clicked.connect(self.convert)

def choose(self):
    self.listWidget.clear()
    self.directory = QtWidgets.QFileDialog.getExistingDirectory(self, "Выберите папку")
    print()

    if self.directory:
        for file_name in os.listdir(self.directory):
            self.listWidget.addItem(file_name)

def convert(self):
    if not self.directory:
    imgs = []
    for fname in os.listdir(self.directory):
        if not fname.endswith(".jpg"):
            continue
        path = os.path.join(self.directory, fname)
        if os.path.isdir(path):
            continue
        imgs.append(path)
    with open("converted_images.pdf", "wb") as f:
        f.write(img2pdf.convert(imgs))

Заранее спасибо!


Ответы (1 шт):

Автор решения: S. Nick

QString QFileDialog::getSaveFileName(QWidget *parent = nullptr, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = nullptr, QFileDialog::Options options = Options())

Это удобная статическая функция, которая возвращает имя файла, выбранное пользователем. Файл не обязательно должен существовать.

Он создает модальный файловый диалог с заданным родительским виджетом.

Больше https://doc.qt.io/qt-5/qfiledialog.html#getSaveFileName

import sys
import os
from pathlib import Path                                               # +++
import img2pdf
from PyQt5 import  QtGui, QtWidgets, QtCore
from PyQt5.Qt import *


class Convert_App(QtWidgets.QMainWindow):  #, ui_window.Ui_MainWindow):
    def __init__(self):
        super().__init__()
#        self.setupUi(self)
        
        self.centralWidget = QtWidgets.QWidget()        
        self.setCentralWidget(self.centralWidget)
        
        self.directory = None
        
        self.listWidget = QListWidget()
        
        self.label = QLabel(alignment=Qt.AlignCenter)                   # +++
        self.label.setOpenExternalLinks(True)                           # +++
        
        self.btn_choose = QPushButton('Choose')
        self.btn_convert = QPushButton('Convert')

        self.btn_choose.clicked.connect(self.choose)
        self.btn_convert.clicked.connect(self.convert)
        
        layout = QGridLayout(self.centralWidget)
        layout.addWidget(self.listWidget, 0, 0, 1, 2)
        layout.addWidget(self.label, 1, 0, 1, 2)
        layout.addWidget(self.btn_choose, 2, 0)
        layout.addWidget(self.btn_convert, 2, 1)

    def choose(self):
        self.listWidget.clear()
        self.directory = QtWidgets.QFileDialog.getExistingDirectory(
            self, 
            "Выберите папку для сканирования:"
        )
        if self.directory:
            for file_name in os.listdir(self.directory):
                self.listWidget.addItem(file_name)

    def convert(self):
        if not self.directory:                                
            msg = QMessageBox.information(
                self, 
                'Внимание', 
                'Выберите пожалуйста каталог.'
            )
            return
        
        imgs = []
        for fname in os.listdir(self.directory):
            if not fname.endswith(".jpg"):
                continue
            path = os.path.join(self.directory, fname)
            if os.path.isdir(path):
                continue
            imgs.append(path)

# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
        options = QFileDialog.Options()
        options |= QFileDialog.DontUseNativeDialog
        fileName, _ = QFileDialog.getSaveFileName(
            self,
            "Выберите путь и имя файла для сохранения.", 
            "",
            "PDF Files (*.pdf)", 
            options=options
        )
        
        if not fileName:
            fileName = "converted_images.pdf"
            
        if not Path(fileName).suffix == '.pdf':
            fileName = f'{fileName}.pdf'
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            
#        with open("converted_images.pdf", "wb") as f:
        with open(fileName, "wb") as f:                                    # +++
            f.write(img2pdf.convert(imgs))

        url = bytearray(QUrl.fromLocalFile(fileName).toEncoded()).decode() # +++
        text = f"<a href={url}>Reference Link `{fileName}`> </a>"          # +++
        self.label.setText(text)                                           # +++
   
  
if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    app.setStyle(QStyleFactory.create("Fusion"))
    w = Convert_App()
    w.resize(700, 400)
    w.show()
    sys.exit(app.exec_()) 

введите сюда описание изображения

введите сюда описание изображения

→ Ссылка