首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >‘'Pixmap’对象没有属性'getImageData‘

‘'Pixmap’对象没有属性'getImageData‘
EN

Stack Overflow用户
提问于 2022-10-28 12:55:21
回答 1查看 127关注 0票数 -1

我试图在python中创建pdf阅读器,我使用过tkPDFViewer库,但是当我根据tkPDFViewer库运行它时,我使用了tkPDFViewer库示例,一开始它显示'Page‘对象没有属性' getPixmap’,但是当我搜索这个问题时,我在堆栈溢出中得到了一个答案,它在代码字体中是pix = page.get_pixmap(),意思是通过将getPixmap替换为get_pixmap()来编辑tkPDFViewer库,但是当我更改它时,它显示了Pixmap‘object没有属性'getImageData’,我怎么解决它呢?

代码语言:javascript
复制
from tkinter import *
from tkinter import filedialog
from tkPDFViewer import tkPDFViewer as pdf
import os

root = Tk()
root.geometry('630x700+400+100')
root.title('PDF viewer')
root.configure(bg='white')
def browseFiles():
    filename = filedialog.askopenfilename(initialdir=os.getcwd(),
                                          title='Select a pdf file',
                                          filetypes=(('PDF File','.pdf'),
                                                     ('PDF File','.PDF'),
                                                     ('All File','.txt')))

    v1 = pdf.ShowPdf()
    v2 = v1.pdf_view(root,pdf_location=open(filename,'r'),
                     width=77,height=100)
    v2.pack(pady=(0,0))
Button(root,text='Open',width=40,
       command=browseFiles,
       font='arial 20',bd=4).pack()



root.mainloop()

编辑后的#和tkPDFViewer库

代码语言:javascript
复制
 try:
    from tkinter import*
    import fitz
    from tkinter.ttk import Progressbar
    from threading import Thread
    import math
except Exception as e:
    print(f"This error occured while importing neccesary modules or library {e}")

class ShowPdf():

    img_object_li = []

    def pdf_view(self,master,width=1200,height=600,pdf_location="",bar=True,load="after"):

        self.frame = Frame(master,width= width,height= height,bg="white")

        scroll_y = Scrollbar(self.frame,orient="vertical")
        scroll_x = Scrollbar(self.frame,orient="horizontal")

        scroll_x.pack(fill="x",side="bottom")
        scroll_y.pack(fill="y",side="right")

        percentage_view = 0
        percentage_load = StringVar()

        if bar==True and load=="after":
            self.display_msg = Label(textvariable=percentage_load)
            self.display_msg.pack(pady=10)

            loading = Progressbar(self.frame,orient= HORIZONTAL,length=100,mode='determinate')
            loading.pack(side = TOP,fill=X)

        self.text = Text(self.frame,yscrollcommand=scroll_y.set,xscrollcommand= scroll_x.set,width= width,height= height)
        self.text.pack(side="left")

        scroll_x.config(command=self.text.xview)
        scroll_y.config(command=self.text.yview)


        def add_img():
            precentage_dicide = 0
            open_pdf = fitz.open(pdf_location)

            for page in open_pdf:
                pix = page.get_pixmap()
                pix1 = fitz.Pixmap(pix,0) if pix.alpha else pix
                img = pix1.getImageData("ppm")
                timg = PhotoImage(data = img)
                self.img_object_li.append(timg)
                if bar==True and load=="after":
                    precentage_dicide = precentage_dicide + 1
                    percentage_view = (float(precentage_dicide)/float(len(open_pdf))*float(100))
                    loading['value'] = percentage_view
                    percentage_load.set(f"Please wait!, your pdf is loading {int(math.floor(percentage_view))}%")
            if bar==True and load=="after":
                loading.pack_forget()
                self.display_msg.pack_forget()

            for i in self.img_object_li:
                self.text.image_create(END,image=i)
                self.text.insert(END,"\n\n")
            self.text.configure(state="disabled")

        def start_pack():
            t1 = Thread(target=add_img)
            t1.start()

        if load=="after":
            master.after(250,start_pack)
        else:
            start_pack()

        return self.frame




def main():
    root = Tk()
    root.geometry("700x780")
    d = ShowPdf().pdf_view(root,pdf_location=r"D:\DELL\Documents\Encyclopedia GUI.pdf",width=50,height=200)
    d.pack()
    root.mainloop()

if __name__ == '__main__':
    main()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-29 12:39:46

请用

代码语言:javascript
复制
img = pix1.tobytes("ppm")

而不是

代码语言:javascript
复制
img = pix1.getImageData("ppm")

在tkPDFViewer库中的第48号行中,编辑了tkPDFViewer库后,它将如下所示

代码语言:javascript
复制
 try:
    from tkinter import*
    import fitz
    from tkinter.ttk import Progressbar
    from threading import Thread
    import math
except Exception as e:
    print(f"This error occured while importing neccesary modules or library {e}")

class ShowPdf():

    img_object_li = []

    def pdf_view(self,master,width=1200,height=600,pdf_location="",bar=True,load="after"):

        self.frame = Frame(master,width= width,height= height,bg="white")

        scroll_y = Scrollbar(self.frame,orient="vertical")
        scroll_x = Scrollbar(self.frame,orient="horizontal")

        scroll_x.pack(fill="x",side="bottom")
        scroll_y.pack(fill="y",side="right")

        percentage_view = 0
        percentage_load = StringVar()

        if bar==True and load=="after":
            self.display_msg = Label(textvariable=percentage_load)
            self.display_msg.pack(pady=10)

            loading = Progressbar(self.frame,orient= HORIZONTAL,length=100,mode='determinate')
            loading.pack(side = TOP,fill=X)

        self.text = Text(self.frame,yscrollcommand=scroll_y.set,xscrollcommand= scroll_x.set,width= width,height= height)
        self.text.pack(side="left")

        scroll_x.config(command=self.text.xview)
        scroll_y.config(command=self.text.yview)


        def add_img():
            precentage_dicide = 0
            open_pdf = fitz.open(pdf_location)

            for page in open_pdf:
                pix = page.get_pixmap()
                pix1 = fitz.Pixmap(pix,0) if pix.alpha else pix
                img = pix1.tobytes("ppm")
                timg = PhotoImage(data = img)
                self.img_object_li.append(timg)
                if bar==True and load=="after":
                    precentage_dicide = precentage_dicide + 1
                    percentage_view = (float(precentage_dicide)/float(len(open_pdf))*float(100))
                    loading['value'] = percentage_view
                    percentage_load.set(f"Please wait!, your pdf is loading {int(math.floor(percentage_view))}%")
            if bar==True and load=="after":
                loading.pack_forget()
                self.display_msg.pack_forget()

            for i in self.img_object_li:
                self.text.image_create(END,image=i)
                self.text.insert(END,"\n\n")
            self.text.configure(state="disabled")

        def start_pack():
            t1 = Thread(target=add_img)
            t1.start()

        if load=="after":
            master.after(250,start_pack)
        else:
            start_pack()

        return self.frame




def main():
    root = Tk()
    root.geometry("700x780")
    d = ShowPdf().pdf_view(root,pdf_location=r"D:\DELL\Documents\Encyclopedia GUI.pdf",width=50,height=200)
    d.pack()
    root.mainloop()

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

https://stackoverflow.com/questions/74235747

复制
相关文章

相似问题

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