Привет. Я пытаюсь отобразить трехмерное изображение, представленное в виде массива, в виде последовательности изображений в графическом интерфейсе tkinter.
Я хотел бы изменить изображение, когда я перемещаюсь через виджет масштаба в tkinter.Программа ниже работает.Но виджет масштаба зависает, и программа через некоторое время зависает.
import SimpleITK as sitk
import numpy as np
import tkinter as Tkinter
from tkinter import Button,Scrollbar
from PIL import Image, ImageTk
import numpy
class mainWindow():
def __init__(self,img):
self.img = img
self.pil_images = []
for i in range(self.img.shape[0]):
img_slice = self.img[i,:,:]
im=Image.frombytes('L', (img_slice.shape[1],img_slice.shape[0]), img_slice.astype('b').tostring())
self.pil_images.append(im)
slices, im_height, im_width = img.shape
margin_width = 30
margin_height = 30
self.root = Tkinter.Tk()
self.frame = Tkinter.Frame(self.root, width=im_width + margin_width*2, height=im_height + margin_height*2)
self.frame.pack()
self.sliderv1 = Tkinter.Scale(self.frame, orient= Tkinter.VERTICAL, from_= np.min(self.img), to= np.max(self.img), length = im_height)
self.sliderv1.set(np.min(self.img))
self.sliderv2 = Tkinter.Scale(self.frame, orient= Tkinter.VERTICAL, from_= np.min(self.img), to= np.max(self.img), length = im_height)
self.sliderv2.set(np.max(self.img))
self.canvas = Tkinter.Canvas(self.frame, width=im_width,height=im_height)
self.sliderh = Tkinter.Scale(self.frame, orient= Tkinter.HORIZONTAL,
from_= np.min(self.img), to= np.max(self.img), length = im_width,
command=self.update_slice,repeatdelay = 1, resolution = 1)
self.sliderv1.pack(side = Tkinter.LEFT)
self.sliderv2.pack(side = Tkinter.LEFT)
self.canvas.pack()
self.sliderh.pack(side = Tkinter.BOTTOM)
self.update_slice(0)
def draw_image(self,slice):
slice = int(slice)
photo = ImageTk.PhotoImage(image=self.pil_images[slice])
self.canvas.delete("IMG")
self.canvas.create_image(0,0,image=photo,anchor=Tkinter.NW)
self.root.update()
self.root.mainloop()
def update_slice(self,val):
slice = val
self.draw_image(slice)
if __name__ == "__main__":
image = sitk.ReadImage("filepath")
im_arr = sitk.GetArrayFromImage(image)
mainWindow(im_arr)