Skip to content Skip to sidebar Skip to footer

I Can't Organize Interaction Between Two Classes, Belonging To Different Frames In Tkinter

The two classes belong to different frames. The challenge is to read data from the window ʻent_dataclass a parent ofForLeftFrame in a descendant class of ForRightFrameChild`. When

Solution 1:

To achive this you need to have references and that is exactly what the error suggests.

So what I did in the code below is first to write your application as a subclass of tk.Tk() so the root parameter or you window is now your own class to modify, also it becomes the controller/director in this ensemble.

Also I created your frames as a subclass of frames, how you did it first with only the application class.

Now, all the magic is in this line and I will explain what happens here for a better understanding.

self.master.left_frame.ent_data.get()

So selfreference to the instance of the class which we had bound to self.right_frame in our class named Application.

The class Application is also the master of self/right_frame. The Application has the attributeleft_frame which we did by self.left_frame in the Application class. self.left_frame was bound to a reference of an instance from the class LeftFrame were we have defined the attribute ent_data which is an tk.Entry that has the method get.

I know it seems confusing in the beginning and you may need to read this text more then onnce, but this is how it works. It is more or less a straight way to go.

import tkinter as tk

#-----------classLeftFrame(tk.Frame):
    def__init__(self, master):
        tk.Frame.__init__(self, master)

        self.ent_data = tk.Entry(self, width=8, bg='#3de',fg='#dff')
        self.ent_data.grid(column=0, row=1)

#-----------classRightFrame(tk.Frame):
    def__init__(self, master):
        tk.Frame.__init__(self,master)

        self.transf_button = tk.Button(self, text="Transfer to...",
                                       bg='#489', fg='#dff',
                                       command=self.transferTo)
        self.transf_button.grid(column=0, row=1)

    deftransferTo(self):
        self.ent_data_st = self.master.left_frame.ent_data.get()
        print('Transfer to...', self.ent_data_st)

#-----------classApplication(tk.Tk):
    def__init__(self):
        super().__init__()

        self.left_frame = LeftFrame(self)
        self.right_frame = RightFrame(self)

        self.left_frame.pack(side='left', fill='both', expand=1)
        self.right_frame.pack(side='right', fill='both', expand=1)


#-----------------------------
app = Application()
app.mainloop()

EDIT:

import tkinter as tk

#-----------classLeftFrame(object):
    def__init__(self, frame):
        self.f = frame
        self.ent_data = tk.Entry(self.f, width=8, bg='#3de',fg='#dff')
        self.ent_data.grid(column=0, row=1)

#-----------classRightFrame(object):
    def__init__(self, frame):
        self.f = frame
        self.transf_button = tk.Button(self.f, text="Transfer to...",
                                       bg='#489', fg='#dff',
                                       command=self.transferTo)
        self.transf_button.grid(column=0, row=1)

    deftransferTo(self):
        self.ent_data_st = self.f.master.for_left_frame.ent_data.get()
        print('Transfer to...', self.ent_data_st)

#-----------classApplication(tk.Tk):
    def__init__(self):
        super().__init__()

        frame1 = tk.Frame(self)
        frame2 = tk.Frame(self)

        self.for_left_frame = LeftFrame(frame1)
        self.for_right_frame = RightFrame(frame2)

        frame1.pack()
        frame2.pack()


#-----------------------------
app = Application()
app.mainloop()

Post a Comment for "I Can't Organize Interaction Between Two Classes, Belonging To Different Frames In Tkinter"