我正在尝试使用 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()