I have faced strange behaviour of tkinter.Canvas and Image in them in particular. Program was made for generating PDFs with desired data. During editing I load current PDF as image into canvas widget for preview. Image is generated by PyMuPDF. First launch is looking fine - PDF loaded and displayed. But when image must be updated, it become invisible. By chance, I found that if I raise exception for image container, image updating itself.
import tkinter
from tkinter import ttk
import fitz
PREVIEW_WIDTH = 606
PREVIEW_HEIGHT = 430
def read_pdf()->tkinter.PhotoImage:
# open created temporary pdf for preview
pdf = fitz.open('customLabel.pdf')
page = pdf.load_page(0)
pix = page.get_pixmap()
imgdata = pix.tobytes('ppm') # extremely fast!
pdf_img = tkinter.PhotoImage(data = imgdata)
print('Current image:',pdf_img)
pdf.close()
return pdf_img
def update_preview(event):
img = read_pdf()
preview.itemconfig(pdf_preview, image=img)
# If line below is disabled, preview will not be updated
pdf_preview[0]=0
root = tkinter.Tk()
frame = tkinter.Frame(root)
frame.pack()
pdf_img=read_pdf()
#setup canvas for preview and place into right frame
preview = tkinter.Canvas(frame, bg='white', width=PREVIEW_WIDTH, height=PREVIEW_HEIGHT)
preview.pack()
pdf_preview = preview.create_image(10,10, anchor='nw', image = pdf_img)
preview.bind('<Double-ButtonPress-1>',update_preview)
root.mainloop()
I have simplify the code as much as possible for demonstration. Image updates on Double Click. Any suggestions and advices is very much appreciated
I already tested update() and update_idleprocess() methods for all of widgets. I did deletion and creation new image into canvas.