我想更新一个Frame/将一个图像的变量推送到现有Frame,但它没有更新
import cv2 as cv
import tkinter as tk
from tkinter import ttk
from MakeImageList import *
from PIL import Image,ImageTk
class mainFrameClass(tk.Tk):
def __init__(self,*args, **kwargs) :
tk.Tk.__init__(self, *args, **kwargs)
container = tk.Frame(self)
container.pack(side='top', fill= 'both', expand=True)
container.grid_rowconfigure(0, weight = 1)
container.grid_columnconfigure(0, weight = 1)
self.frames = {}
self.shared_data ={"image_number":"pyimage1"}
for F in (StartPage,Vizualizator,Filtre,Procesare):
frame = F(container,self)
self.frames[F] = frame
frame.grid(row = 0, column = 0, sticky ="nsew")
self.show_frame(StartPage)
def show_frame(self, cont,**kwargs):
frame = self.frames[cont]
frame.tkraise()
self.shared_data.update(kwargs)
class StartPage(tk.Frame):
def __init__(self,parent,controller):
tk.Frame.__init__(self, parent)
label = ttk.Label(self, text="Pagina de start")
label.grid(row = 0, column = 4, padx = 10, pady = 10)
button1 = ttk.Button(self, text ="Vizualizator",command = lambda : controller.show_frame(Vizualizator))
button1.grid(row = 1, column = 1, padx = 10, pady = 10)
button3 = ttk.Button(self, text ="Procesare Imagini",command = lambda : controller.show_frame(Procesare))
button3.grid(row = 3, column = 1, padx = 10, pady = 10)
class Filtre(tk.Frame):
def __init__(self, parent,controller):
tk.Frame.__init__(self, parent)
image_dump = controller.shared_data["image_number"]
self.imageLabel=ttk.Label(self,image= image_dump)
self.imageLabel.grid(row=3,column=1,columnspan=5)
button1 = ttk.Button(self, text ="Inapoi",command = lambda : controller.show_frame(Vizualizator))
button1.grid(row = 1,column = 1,padx = 10,pady =10)
class Procesare(tk.Frame):
def __init__(self, parent,controller):
tk.Frame.__init__(self, parent)
label = ttk.Label(self, text ="Procesare Imagini")
label.grid(row = 0, column = 4, padx = 10, pady = 10)
button1 = ttk.Button(self, text ="Pagina de Start",command = lambda : controller.show_frame(StartPage))
button1.grid(row = 1,column = 1,padx = 10,pady =10)
#no further updates
class Vizualizator(tk.Frame):
def __init__(self, parent,controller):
tk.Frame.__init__(self, parent)
image_list = MakeImageList()
myLabel =ttk.Label(self,image=image_list[0])
myLabel.grid(row=3,column=1,columnspan=5)
def forward(image_number,myLabel):
myLabel.grid_forget()
myLabel = ttk.Label(self,image=image_list[image_number-1])
button2 = ttk.Button(self, text=">>>",command=lambda:forward(image_number+1,myLabel))
if image_number == 3:
button2 =ttk.Button(self,text=">>>",state=DISABLED)
button2.grid(row = 1,column = 5,padx=10,pady=10)
button4 = ttk.Button(self,text="Filtre",command= lambda:show_filtre(image_number))
button4.grid(row= 1,column=4,padx=10,pady=10)
button3 = ttk.Button(self, text="<<<",command=lambda:backward(image_number-1,myLabel))
button3.grid(row = 1,column = 3,padx=10,pady=10)
myLabel.grid(row=3,column=1,columnspan=5)
def backward(image_number,myLabel):
myLabel.grid_forget()
myLabel = ttk.Label(self,image=image_list[image_number-1])
button2 = ttk.Button(self, text=">>>",command=lambda:forward(image_number+1,myLabel))
button2.grid(row = 1,column = 5,padx=10,pady=10)
button4 = ttk.Button(self,text="Filtre",command= lambda:show_filtre(image_number))
button4.grid(row= 1,column=4,padx=10,pady=10)
button3 = ttk.Button(self, text="<<<",command=lambda:backward(image_number-1,myLabel))
if image_number == 1:
button3 =ttk.Button(self,text="<<<",state=DISABLED)
button3.grid(row = 1,column = 3,padx=10,pady=10)
myLabel.grid(row=3,column=1,columnspan=5)
def show_filtre(current_image_number):
controller.shared_data["image_number"] = image_list[current_image_number-1]
controller.show_frame(Filtre)
button1 = ttk.Button(self, text ="Pagina de Start",command = lambda : controller.show_frame(StartPage))
button1.grid(row = 1,column = 1,padx = 10,pady =10)
button2 = ttk.Button(self,text = ">>>",command = lambda :forward(2,myLabel))
button2.grid(row = 1,column = 5,padx=10,pady=10)
button4 = ttk.Button(self,text="Filtre",command= lambda:show_filtre(1))
button4.grid(row= 1,column=4,padx=10,pady=10)
button3 = ttk.Button(self,text = "<<<",state=DISABLED)
button3.grid(row = 1,column = 3,padx=10,pady=10)
app = mainFrameClass()
app.mainloop()
我试着创建一个共享内容的字典,但我需要更新框架,而after()这个函数却不管用。
1 个回答
0
为了在每次打开Filtre
页面时更新里面的图片,有一种方法是重写tkraise()
这个函数:
class Filtre(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller # save controller for later use
self.imageLabel = ttk.Label(self)
self.imageLabel.grid(row=3, column=1, columnspan=5)
button1 = ttk.Button(self, text="Inapoi", command=lambda: controller.show_frame(Vizualizator))
button1.grid(row=1, column=1, padx=10, pady=10)
# overload tkraise()
def tkraise(self):
# update the label's image
image = self.controller.shared_data["image_number"]
self.imageLabel.config(image=image)
# call the original tkraise()
super().tkraise()