Tkinter Canvas PDF Viewer Следующая страница рендеринг работает только при отладке

Я пытаюсь написать просмотрщик PDF в Python/Tkinter, используя библиотеку PyMuPDF. Я могу успешно открыть документ и отобразить первую страницу, но при попытке перейти на следующую страницу, удалив изображение холста и создав новую на новой странице, я получаю пустой экран. Первая страница удалена, но вторая страница не отображается.

Однако, когда я запускаю программу через VS Code и устанавливаю точку останова отладки в nxtBtn_Click Пошаговая функция и построчно, вторая страница появится в окне, как и ожидалось, когда функция завершится.

Я пытался, но получить те же результаты:

  • С помощью canvas.update_idletasks() заставить перекрасить холст.
  • Разделение шага удаления и шага create_image на события ondown и onup.
  • Использование функции обратного вызова, переданной window.after_idle
  • Обновление существующего изображения новым изображением
    • canvas.itemconfig(canvasPdf, image = tkimg)

Я использую Python 3.7.1 в Windows 10.

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()

0 ответов

Другие вопросы по тегам