Как мне запретить tkPDFViewer комбинировать PDF-файлы при открытии PDF-файлов с помощью кнопок?

#python #python-3.x #pdf #tkinter

Вопрос:

В этом коде я пытаюсь открыть PDF-файлы в отдельном окне с помощью tkinter и tkPDFViewer. Способ, которым это делается, заключается в том, что открывается простой пользовательский интерфейс с 2 кнопками для 2 статей, к которым в этом случае можно получить доступ с моего компьютера (но я просто обозначил его «путь к файлу» для пути к файлу, чтобы избежать раскрытия личной информации). Однако, хотя кнопки работают и открывают окно PDF и окно загрузки под ним (как и ожидалось), когда вы закрываете окно PDF (и окно загрузки закрывается вместе с ним), а затем повторно нажимаете на кнопку (ту же или другую), она показывает предыдущий pdf и текущий, которые появились при повторном щелчке в сочетании. Когда вы повторяете этот процесс, PDF-файлы просто добавляются друг к другу. Однако должно произойти то, что будет показан соответствующий PDF-файл статьи, описанной в кнопке, и никаких других PDF-файлов. Как мне это исправить? Я уже пытался переместить инициализацию PDF за пределы функции события, а затем повторно инициализировать ее, но это приводит к ошибке «локальная переменная, используемая до определения», так что это не работает, и в настоящее время я не знаю другого способа сделать это.

 pdfArray = [
    ["skweak: Weak Supervision Made Easy for NLP",
    r"filepath", 
    "Pierre Lison, Jeremy Barnes, and Aliaksandr Hubin",
    "skweak, NLP, Natural Language Processing"],
    
    ["Information Theoretic-Based Quality Measures for Clustering",
    r"filepath",
    "Barry Drake, and Tiffany Huang",
    "Quality Measures, Clustering, Data"
    ]
]

#Import tkinter library
import os
from tkinter import *
import tkinter as tk
from tkinter import ttk
from tkPDFViewer import tkPDFViewer as pdfViewer
from functools import partial
import shutil

#Create an instance of tkinter frame or window
mainWin= Tk()

#Set the geometry of tkinter frame
mainWin.geometry("1000x600 20 20")
download_icon = tk.PhotoImage(file=r'filepath')
paw_icon = tk.PhotoImage(file=r'filepath')

def download_pdf(original_file):
    #this if-else statment detects if the original file exists.
    if os.path.isfile(original_file):
        newFileStem = os.path.expanduser('~')   r"DownloadsChatBox_download"
        num = 0
        while os.path.isfile(newFileStem   "(%d).pdf"%num):
           num = num   1;

        newFile = newFileStem   "(%d).pdf"%num

        f = open(newFile, "x")
        shutil.copyfile(original_file, newFile)


        completeWin = Toplevel(mainWin)
        completeWin.geometry("400x75 660 480")
        completeWin.title("Download Complete")
        Label(completeWin, text = "Download Complete!", font = ('Gabriola', 14, 'bold')).pack()
        Label(completeWin, text = str(newFile), font = ('Gabriola', 10)).pack(pady=2)
        
    else:
        notFoundWin = Toplevel(mainWin)
        notFoundWin.geometry("200x75 660 480")
        notFoundWin.title("File Not Found")
        Label(notFoundWin, text = "File Not Found", font = ('Gabriola', 14, 'bold')).pack(pady=20)


#Define a new function to open the window
def open_win(pdf_ID):
   pdf_title = pdfArray[pdf_ID][0] #title of pdf
   file_location = pdfArray[pdf_ID][1] #location of pdf
   authors = pdfArray[pdf_ID][2] #authors
   keywords = pdfArray[pdf_ID][3] #keywords
    
   pdfWin = Toplevel(mainWin)
   pdfWin.geometry("600x350 640 20")
   pdfWin.title(pdf_title)

   # Adding pdf location and width and height.

   pdfViewer.ShowPdf().pdf_view(pdfWin, pdf_location=file_location, width=70, height=100).pack(ipadx = 10, ipady = 10)

   infoWin = Toplevel(pdfWin)
   infoWin.geometry("600x200 640 420")
   infoWin.title("PDF Information")
   
   Label(infoWin, text = "Information: ", font = ('Gabriola', 15, 'bold')).pack(pady=2)
   Label(infoWin, text = "Title: "   pdf_title, font = ('Gabriola', 12)).pack(pady=1) 
   Label(infoWin, text = "Author(s): "   authors, font = ('Gabriola', 12)).pack(pady=1)
   Label(infoWin, text = "Keyword(s): "   keywords, font = ('Gabriola', 12)).pack(pady=1)
   tk.Button(infoWin, image=download_icon, borderwidth = 0, command=partial(download_pdf, file_location)).pack(pady=1)

    
#Create a label
Label(mainWin, text= "Click any button below to open a PDF", font= ('Gabriola', 25, 'bold')).pack(pady=30, padx = 10)

#Create a button to open a New Window
for ID in range(0, len(pdfArray)):
    tk.Button(mainWin, image=paw_icon, compound=LEFT, text="  Open " "   pdfArray[ID][0] " "", font= ('Gabriola', 12), command=partial(open_win, ID)).pack(pady=2)
    
mainWin.mainloop()
 

Ответ №1:

Я также столкнулся с этой проблемой при использовании tkPDFViewer. Чтобы исправить это, мне пришлось зайти в модуль tkPDFViewer и добавить строку:

 self.img_object_li.clear()
 

сразу после строки:

     def add_img():
 

Я сам всего лишь новичок, так что это было мое решение, чтобы обойти проблему.
Из того, что я понимаю, линия:

         self.img_object_li.append(timg)
 

добавляет изображения бесконечно, я пытался уничтожить рамку и виджеты, содержащие объекты из моей основной программы, но не смог заставить ее работать вообще. Проблема просто продолжала сохраняться. Вероятно, это не лучший способ сделать это, и у кого-то другого будет лучшее решение.

Комментарии:

1. Превосходный Ответ ! Большое спасибо!. Я не являюсь первоначальным автором вопроса, но этот ответ мне очень помог. Спасибо!