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
.