Как я могу исправить повторяющиеся вызовы root.mainloop () в функции change ()?Я хочу изменить изображение с изменением полос прокрутки - PullRequest
0 голосов
/ 05 февраля 2019

Есть 10 ползунков, и каждое изменение значения ползунка изменяет изображение в окне.Но я не могу найти способ сделать это без вызова root.mainloop () в функции change ().Хотя это в конечном итоге вызывает переполнение стека, и я проверил это, напечатав длину трассировки (переменная 'memory').

root = tk.Tk()

class SliderClass:
    def __init__(self,i,j):
        global no
        self.no = no
        self.w = Scale(root, label="PCA_feature "+str(self.no+1), 
            from_=10, to=-10, tickinterval=0.1, orient=HORIZONTAL, showvalue=0)
        self.w.grid(row=i,column=j)
        self.w.bind("<ButtonRelease-1>", self.change)
        self.w.set(np.clip(z[self.no],-10.0,10.0))
        no +=1

    def change(self, event):
        memory = ''.join(traceback.format_stack())
        print(len(memory))
        z[self.no] = self.w.get()
        z_inv = pca.inverse_transform(z).reshape((1,-1))
        im = G.layers[2].predict(z_inv)
        im = (0.5 * im + 0.5)*255
        im = im[0,:,:,:].astype('uint8')
        im = cv2.resize(im,(150,150))
        im = Image.fromarray(im)
        im = PhotoImage(im)
        panel.configure(image=im)
        root.mainloop()

im = Image.fromarray(im)
im = PhotoImage(im)
panel = Label(root, image = im, width=300,height=300)
panel.grid(rowspan=2,column=0)

r,c = 2,5
for i in range(r):
    for j in range(1,c+1):
        s = SliderClass(i,j)
        sliders.append(s)

root.mainloop()

1 Ответ

0 голосов
/ 05 февраля 2019

Вам не нужно вызывать mainloop в вашей функции.Его следует вызывать ровно один раз за всю жизнь вашей программы.

Тот факт, что изображение не отображается при удалении вызова mainloop, заключается в том, что вы не сохраняете ссылку на изображение, поэтому оно удаляется сборщиком мусора, когда функция выходит изобъем.Запустив mainloop в функции, вы предотвратите это, но вызовете еще худшие проблемы (а именно ту, о которой пишете)

В дополнение к удалению вызова mainloop внутри вашей функции,вам нужно сохранить ссылку на изображение объекта.Простым изменением будет использование атрибута типа self.im вместо локальной переменной im.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...