Python Tkinter не уменьшается область скроллинга

Пишу простой ПДФ редактор по подобию https://github.com/pyGuru123/Python-Projects/tree/master/Moonlight%20PDF%20Reader

Открываю ПДФ файл, получаю изображение страницы, затем создаю полученное изображение на канвасе. Если изображение не помещается на канвас, то работают скроллбары. При увеличении масштабирования скроллбары увеличиваются. Однако при последующем уменьшении изображения скроллбары не уменьшаются.

Вот код:

from tkinter import*
from tkinter import filedialog
import fitz

class App(Frame):
    def __init__(self, master):
        super().__init__(master)
        self.pack()
        
        self._attributes()

        self.frame_top()
        self.frame_canvas()

    def _attributes(self):
        self.filepath = None
        self.current_page = 0
        self.zoom = 1

    def frame_top(self):
        self.frm_top = Frame(self)
        self.frm_top.pack(fill=X)

        self.btn_open = Button(self.frm_top,text="Открыть PDF",command=self.open_file)
        self.btn_open.pack(side=RIGHT)

        self.btn_zoomin = Button(self.frm_top,text="Zoom In",command=self.zoom_in)
        self.btn_zoomin.pack(side=LEFT)

        self.btn_zoomout = Button(self.frm_top,text="Zoom In",command=self.zoom_out)
        self.btn_zoomout.pack(side=LEFT)

    def frame_canvas(self):
        self.frm_canvas = Frame(self)
        self.frm_canvas.pack()

        self.scrollx = Scrollbar(self.frm_canvas, orient=HORIZONTAL)
        self.scrollx.grid(row=1,column=0,sticky='we')

        self.scrolly = Scrollbar(self.frm_canvas, orient=VERTICAL)
        self.scrolly.grid(row=0,column=1,sticky='ns')

        self.output = Canvas(self.frm_canvas,width=700,height=700,highlightthickness=0)
        self.output.configure(yscrollcommand=self.scrolly.set, xscrollcommand=self.scrollx.set)
        self.output.grid(row=0,column=0)

        self.scrollx.configure(command=self.output.xview)
        self.scrolly.configure(command=self.output.yview)

    def open_file(self):
        self.filepath = filedialog.askopenfilename(title="Открыть PDF", filetypes=(("PDF","*.pdf"),))
        
        self.frm_top.destroy()
        self.frame_top()

        self.frm_canvas.destroy()
        self.frame_canvas()

        self.update()
        self.get_image()

    def get_image(self):
        self.img_file = self.get_page(self.filepath,self.current_page, self.zoom)
        self.image_canvas = self.output.create_image(0, 0, anchor='center', image=self.img_file)
        self.output.configure(scrollregion=self.output.bbox(ALL))

    def get_page(self,filepath,page_num, zoom=None):
        self.pdf = fitz.open(filepath)
        page = self.pdf.load_page(page_num)
        if zoom:
            mat = fitz.Matrix(zoom, zoom)
            pix = page.get_pixmap(matrix=mat)
        else:
            pix = page.get_pixmap()
        px1 = fitz.Pixmap(pix, 0) if pix.alpha else pix
        imgdata = px1.tobytes('ppm')
        return PhotoImage(data=imgdata)

    def zoom_in(self):
        if self.zoom < 1.6:
            self.zoom = round(self.zoom + 0.2, 1)
            self.get_image()

    def zoom_out(self):
        if self.zoom > 0.6:
            self.zoom = round(self.zoom - 0.2, 1)
            self.get_image()

if __name__ == "__main__":
    root = Tk()
    myapp = App(root)
    myapp.mainloop()

Если вместо self.output.configure(scrollregion=self.output.bbox(ALL)) указать self.output.configure(scrollregion=self.output.bbox(self.image_canvas)), то тогда все работает корректно.

Почему не работает с bbox(ALL)?


Ответы (0 шт):