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