1

我正在尝试使用 PyMuPDF 库在 Python/Tkinter 中编写 PDF 查看器。我可以成功打开文档并呈现第一页,但是当尝试通过删除 Canvas 图像并从新页面创建新图像来移动到下一页时,我得到一个空白屏幕。第一页被删除,但第二页不显示。

但是,当我通过 VS Code 运行程序并在函数中设置调试断点nxtBtn_Click并逐行执行时,当函数完成时,第二页将按预期出现在窗口中。

我试过了,但得到相同的结果:

  • 用于canvas.update_idletasks()强制重新绘制画布。
  • 将 delete 步骤和 create_image 步骤拆分为 ondown 和 onup 事件。
  • 使用传递给的回调函数window.after_idle
  • 使用新图像更新现有图像
    • canvas.itemconfig(canvasPdf, image = tkimg)

我在 Windows 10 上运行 Python 3.7.1。

from tkinter import *
from PIL import Image, ImageTk
import fitz
import math

window = Tk()
window.geometry("800x800")

doc = fitz.open(r"<<Path to pdf here>>")
currentPage = 0

canvas = Canvas(window, width=800, height=600)
canvas.grid(column=0, row=0)

pix = doc[currentPage].getPixmap()
shrinkFactor = int(canvas.cget("height")) / pix.height
mode = "RGBA" if pix.alpha else "RGB"
img = Image.frombytes(mode, [pix.width, pix.height], pix.samples)
img = img.resize((math.floor(pix.width * shrinkFactor), math.floor(pix.height * shrinkFactor)))

tkimg = ImageTk.PhotoImage(img)
canvasPdfs = canvas.create_image(0, 0, anchor=NW, image=tkimg)
def nxtBtn_Click(event):
    global doc, currentPage, canvas, canvasPdfs
    canvas.delete(canvasPdfs)

    currentPage += 1
    pix = doc[currentPage].getPixmap()
    shrinkFactor = int(canvas.cget("height")) / pix.height
    mode = "RGBA" if pix.alpha else "RGB"
    img = Image.frombytes(mode, [pix.width, pix.height], pix.samples)
    img = img.resize((math.floor(pix.width * shrinkFactor), math.floor(pix.height * shrinkFactor)))

    tkimg = ImageTk.PhotoImage(img)
    canvasPdfs = canvas.create_image(0, 0, anchor=NW, image=tkimg)

nxtBtn = Button(window, text="Next")
nxtBtn.grid(column=0, row=1)
nxtBtn.bind("<Button-1>", func=nxtBtn_Click)

window.mainloop()
4

0 回答 0