Как сделать так, чтобы приложение запрашивало как назвать и куда поместить получившийся файл?
Как сделать так, чтобы приложение после нажатия на кнопку 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 шт):
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_())

