我想更新一个框架/将图像的变量推送到现有框架,但它不更新

问题描述 投票:0回答:1
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() 函数不起作用

python tkinter tk-toolkit ttk
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()
© www.soinside.com 2019 - 2024. All rights reserved.