Python Forum
[Tkinter] How to add multiple frames to main window - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: GUI (https://python-forum.io/forum-10.html)
+--- Thread: [Tkinter] How to add multiple frames to main window (/thread-25571.html)

Pages: 1 2


How to add multiple frames to main window - Dandy_Don - Apr-03-2020

I am stumped. I can't figure out how to add multiple frames to the main window in a GUI....

I have a system that uses multiple winches to raise/lower things. I want to create a GUI that shows each winch & allows for control of them.

Since the winch frame is the same for each winch (except for the winch name, "Top Right", etc.) I created a class for the winch frame. Then I created a main app class. I can't seem to get the winches added to the main app, though....


from tkinter import  *

class WinchFrame(Frame):
    def __init__(self):
        super().__init__()

        #  CREATE WIDGETS:
        self.winch_lbl = Label(text="Top Right", width=15)
        self.lbl_btn_up = Label(text="UP")
        self.btn_up = Button(text="OFF", width=12, fg='green')
        self.txt = Text(height=1, width=50, bg="light blue")
        self.lbl_btn_down = Label(text="DOWN")
        self.btn_down = Button(text="OFF", width=12, fg='green')
        #  LAYOUT:
        self.winch_lbl.grid(row = 1, column = 0, padx=5, pady=5)
        self.lbl_btn_up.grid(row=1, column=1, padx=5, pady=5)
        self.btn_up.grid(row=1, column=2, padx=5, pady=5)
        self.lbl_btn_down.grid(row=3, column=1, padx=5, pady=5)
        self.btn_down.grid(row=3, column=2, padx=5, pady=5)
        self.txt.grid(row = 5, column=1, columnspan=2, padx=5, pady=5)


class WinchApp(Tk):
    def __init__(self):

        self.frames = {}
        self.frames["Top Right"] = WinchFrame(parent=container, controller=self)
        self.frames["Top Right"].grid(row=0, column=0, sticky="nsew")

        self.Top_Right = WinchFrame()
        self.Bot_Right = WinchFrame()
        self.Top_Right.grid(row=0, column=0, sticky='nsew')
        self.Bot_Right.grid(row=5, column=0, sticky='nsew')


if __name__ == "__main__":
    app = WinchApp()
    app.mainloop
Any help you can offer will be greatly appreciated!


RE: How to add multiple frames to main window - Larz60+ - Apr-03-2020

create additional instances of WinchFrame


RE: How to add multiple frames to main window - Dandy_Don - Apr-03-2020

I thought that was what I did in the WinchApp class:


        self.Top_Right = WinchFrame()
        self.Bot_Right = WinchFrame()
        self.Top_Right.grid(row=0, column=0, sticky='nsew')
        self.Bot_Right.grid(row=5, column=0, sticky='nsew')
Am I missing something?


RE: How to add multiple frames to main window - Larz60+ - Apr-04-2020

on line 27 you're calling WinchFrame with attributes that don't exist.


RE: How to add multiple frames to main window - Dandy_Don - Apr-07-2020

Oops! That was where I was trying to add it to a container..... I got it from this post:

https://stackoverflow.com/questions/7546050/switch-between-two-frames-in-tkinter

That didn't work either. Maybe I didn't use the container right.....


RE: How to add multiple frames to main window - Larz60+ - Apr-07-2020

Well, if you are going to try code that doesn't 'work'
at least show us what (runnable code) didn't work


RE: How to add multiple frames to main window - Dandy_Don - Apr-07-2020

I can get the labels & buttons & text entry widgets grouped together in a window....

class WinchFrame(Frame):
    def __init__(self):
        super().__init__()

        #  CREATE WIDGETS:
        self.winch_lbl = Label(text="Top Right", width=15)
        self.lbl_btn_up = Label(text="UP")
        self.btn_up = Button(text="OFF", width=12, fg='green')
        self.txt = Text(height=1, width=50, bg="light blue")
        self.lbl_btn_down = Label(text="DOWN")
        self.btn_down = Button(text="OFF", width=12, fg='green')
        #  LAYOUT:
        self.winch_lbl.grid(row = 1, column = 0, padx=5, pady=5)
        self.lbl_btn_up.grid(row=1, column=1, padx=5, pady=5)
        self.btn_up.grid(row=1, column=2, padx=5, pady=5)
        self.lbl_btn_down.grid(row=3, column=1, padx=5, pady=5)
        self.btn_down.grid(row=3, column=2, padx=5, pady=5)
        self.txt.grid(row = 5, column=1, columnspan=2, padx=5, pady=5)
But I do not know how to make multiple copies of that class appear in a well-organized appearance in a window.


RE: How to add multiple frames to main window - Riddle - Apr-09-2020

When you define the Widgets in the WinchFrame Class, you have to assign them to the Frame. Otherwise, they get assigned to the main window, and put in the grid there. All you have to do is add "self" to those Widgets. I also fixed the other issue that was already mentioned.

from tkinter import  *
 
class WinchFrame(Frame):
    def __init__(self):
        super().__init__()
 
        #  CREATE WIDGETS:
        winch_lbl = Label(self, text="Top Right", width=15)
        lbl_btn_up = Label(self, text="UP")
        btn_up = Button(self, text="OFF", width=12, fg='green')
        txt = Text(self, height=1, width=50, bg="light blue")
        lbl_btn_down = Label(self, text="DOWN")
        btn_down = Button(self, text="OFF", width=12, fg='green')
        #  LAYOUT:
        winch_lbl.grid(row = 1, column = 0, padx=5, pady=5)
        lbl_btn_up.grid(row=1, column=1, padx=5, pady=5)
        btn_up.grid(row=1, column=2, padx=5, pady=5)
        lbl_btn_down.grid(row=3, column=1, padx=5, pady=5)
        btn_down.grid(row=3, column=2, padx=5, pady=5)
        txt.grid(row = 5, column=1, columnspan=2, padx=5, pady=5)

class WinchApp(Tk):
    def __init__(self):
        super().__init__()
 
        self.Top_Right = WinchFrame()
        self.Bot_Right = WinchFrame()
        self.Top_Right.grid(row=0, column=0, sticky='nsew')
        self.Bot_Right.grid(row=5, column=0, sticky='nsew')
 
if __name__ == "__main__":
    app = WinchApp()
    app.mainloop



RE: How to add multiple frames to main window - Dandy_Don - Apr-10-2020

Thanks, Riddle.

When I make the changes you suggest & run the code, it does nothing.... The output says "Process finished with exit cod 0"

Do I need to "show" the window somehow?


RE: How to add multiple frames to main window - Riddle - Apr-10-2020

I am at a loss. If I run that exact same code, it works with no errors.

Did you try to copy and paste my code into a new file, just to see if it works? Maybe it is a minor difference in code that you are missing.
Also, I doubt that it matters, but I am using Version 3.8.2 of Python.