Python 3.x tkinter, PIL не может показать большое изображение, изображение автоматически вырезано

Это мой первый опыт работы с tkinterпакет. Я пытаюсь показать большое изображение (5000, 5000) в маленьком окне, используя прокрутку по осям x и y, чтобы исследовать все изображение. Следуя этому ответу, я реализовалScrollabarImage:

import tkinter 
from PIL import Image, ImageTk
class ScrollableImage(tkinter.Canvas):
    def __init__(self, master=None, **kw):
        self.image = kw.pop('image', None)
        super(ScrollableImage, self).__init__(master=master, **kw)
        self['highlightthickness'] = 0
        self.propagate(0)  # wont let the scrollbars rule the size of Canvas
        self.create_image(0,0, anchor='nw', image=self.image)
        # Vertical and Horizontal scrollbars
        self.v_scroll = tkinter.Scrollbar(self, orient='vertical', width=6)
        self.h_scroll = tkinter.Scrollbar(self, orient='horizontal', width=6)
        self.v_scroll.pack(side='right', fill='y')
        self.h_scroll.pack(side='bottom', fill='x')
        # Set the scrollbars to the canvas
        self.config(xscrollcommand=self.h_scroll.set, 
                yscrollcommand=self.v_scroll.set)
        # Set canvas view to the scrollbars
        self.v_scroll.config(command=self.yview)
        self.h_scroll.config(command=self.xview)
        # Assign the region to be scrolled 
        self.config(scrollregion=self.bbox('all'))

        self.focus_set()
        self.bind_class(self, "<MouseWheel>", self.mouse_scroll)

    def mouse_scroll(self, evt):
        if evt.state == 0 :
            # self.yview_scroll(-1*(evt.delta), 'units') # For MacOS
            self.yview_scroll( int(-1*(evt.delta/120)) , 'units') # For windows
        if evt.state == 1:
            # self.xview_scroll(-1*(evt.delta), 'units') # For MacOS
            self.xview_scroll( int(-1*(evt.delta/120)) , 'units') # For windows

И в основном:

if __name__ == "__main__":
    hdul = fits.open('gputest.fits')
    data = hdul[1].data
    header = hdul[1].header

    img = Image.fromarray(data, mode='F')

    root = tkinter.Tk()
    root.geometry("1000x1000") 
    root.resizable(0, 0) #Don't allow resizing in the x or y direction

    show_image = ScrollableImage(root, image=img)
    show_image.pack()

    root.mainloop()

Но результат совершенно неверный:

Проблема в том, что изображение не полное, оно было вырезано. Даже если прокрутки работают, я не могу двигаться по всему изображению, отображался только вырез. Почему так происходит?

Я хотел бы: расширить изображение на весь размер окна, сохранив прокрутки, поскольку изображение больше размера окна. Я попытался оштрафовать за объяснение и исправить код, но не смог найти решения, возможно, потому, что я новичок вtkinter.

0 ответов

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