#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. Превосходный Ответ ! Большое спасибо!. Я не являюсь первоначальным автором вопроса, но этот ответ мне очень помог. Спасибо!