首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我使用按钮打开PDF时,如何从组合tkPDFViewer中购买PDF?

当我使用按钮打开PDF时,如何从组合tkPDFViewer中购买PDF?
EN

Stack Overflow用户
提问于 2021-07-15 03:28:24
回答 1查看 128关注 0票数 0

在这段代码中,我尝试使用tkinter和tkPDFViewer将PDF作为一个单独的窗口打开。这样做的方式是一个简单的UI打开了两个按钮,在这种情况下,从我的电脑访问两篇文章(但我只是将其标记为文件路径,以避免泄露个人信息)。但是,当按钮工作并打开PDF窗口和其下方的下载窗口(如预期)时,当您关闭PDF窗口(下载窗口也随之关闭),然后重新单击按钮(相同的或不同的),它会显示以前的pdf和当前出现的pdf,当您重新单击组合。当你重复这个过程时,PDF文件就会互相追加。但是,应该发生的情况是,将显示与按钮中描述的文章相对应的PDF,而不显示其他PDF。我该如何解决这个问题?我已经尝试将PDF初始化移到事件函数之外,然后重新初始化它,但这会导致“在定义之前使用本地变量”错误,所以这不起作用,目前我不知道有什么其他方法可以做到这一点。

代码语言:javascript
复制
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"\Downloads\ChatBox_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()
EN

回答 1

Stack Overflow用户

发布于 2021-09-09 14:15:37

我在使用tkPDFViewer时也遇到了这个问题。为了解决这个问题,我不得不进入tkPDFViewer模块并添加一行代码:

代码语言:javascript
复制
self.img_object_li.clear()

紧跟该行之后:

代码语言:javascript
复制
    def add_img():

我自己也只是个初学者,所以这是我解决这个问题的办法。根据我对这句话的理解:

代码语言:javascript
复制
        self.img_object_li.append(timg)

无限期地添加图像时,我试图销毁主程序中包含对象的框架和窗口小部件,但根本无法让它工作。这个问题一直在持续。这可能不是最好的方法,其他人会有更好的修复方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68384054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档