Home > database >  Tkinter.asksaveasfile() use
Tkinter.asksaveasfile() use

Time:10-30

The use of the askopenfilename is quite easy but its counterpart is a bit more complicated. I can get the box to open and enter the name but the file created is empty

import tkinter as tk
from tkinter.filedialog import askopenfilename, asksaveasfilename
import PyPDF4

# import des fichiers
root = tk.Tk()
root.withdraw()
file1 = askopenfilename()
file2 = askopenfilename()

# import des fichiers pdf
pdfFile1 = PyPDF4.PdfFileReader(file1, 'rb')
pdfFile2 = PyPDF4.PdfFileReader(file2, 'rb')

#création de l'objet pdf
newPdf = PyPDF4.PdfFileWriter()

# fonction d'extraction des pages du pdf
def extract_page(pdfFile):
    for numPage in range(pdfFile.numPages):
        page = pdfFile.getPage(numPage)
        newPdf.addPage(page)
                
# application de la fct sur nos objets-pdf
extract_page(pdfFile1)
extract_page(pdfFile2)

# création du nouveau Pdf et écriture
file = asksaveasfilename(defaultextension=".pdf")
pdfCombined = open(file, "wb")
newPdf.write(pdfCombined)
file.close()

My previous script is pdfCombined = open('path', 'wb') but i want the program to ask for a file name

CodePudding user response:

It worked for me without errors and two were written to one file.

file = asksaveasfilename(defaultextension=".pdf")
# pdfCombined = open(file, "wb")
# newPdf.write(pdfCombined)
# file.close()
with open(file, "wb") as f:
    newPdf.write(f)

CodePudding user response:

Seems like you mixed up your paths and file objects. I also noticed some minor issues with the call arguments for your pdf reader and the file browser which I solved by adding or removing code snippets, see the comments in my code. Your file probably stayed empty because you never closed it. This is one of many reasons why you should use the with context manager in Python.

import tkinter as tk 
from tkinter.filedialog import askopenfilename, asksaveasfilename
import PyPDF4  # .__version__ == '1.27.0'

# import des fichiers
root = tk.Tk()
root.withdraw()
file1 = askopenfilename()
file2 = askopenfilename()

# import des fichiers pdf
pdfFile1 = PyPDF4.PdfFileReader(file1)  # 'rb' --> no mode argument availabe
pdfFile2 = PyPDF4.PdfFileReader(file2)  # , 'rb' --> no mode argument availabe

# création de l'objet pdf
newPdf = PyPDF4.PdfFileWriter()


# fonction d'extraction des pages du pdf
def extract_page(pdfFile):
    for numPage in range(pdfFile.numPages):
        page = pdfFile.getPage(numPage)
        newPdf.addPage(page)


# application de la fct sur nos objets-pdf
extract_page(pdfFile1)
extract_page(pdfFile2)

# création du nouveau Pdf et écriture
file = asksaveasfilename(defaultextension=".pdf",
                         filetypes=[("pdf files", '*.pdf')]  # add this to actually filter for PDFs in file browser
                         )  # returns path (of type <class 'str'>)
# print("file type: ", type(file))
with open(file, "wb") as pdfCombined:
    newPdf.write(pdfCombined)
# file.close()
  • Related