0

I just finished my first program, and now in order do expand, I'm looking for ways to improve it. And eliminate repetition and create some form of scalability. And this piece of code:

from tkinter import *
from tkinter import ttk

#Creating window, calling it root
root = Tk()
root.title("Ges_Stock")
root.geometry("1000x600")

#Creating Notebook so I can create tabs on it
my_notebook = ttk.Notebook(root)
my_notebook.pack(pady=10, fill="both")


# Tabs creation, packing, and naming it
my_frame1 = Frame(my_notebook, width=1200, height=700)
my_frame2 = Frame(my_notebook, width=1200, height=700)
my_frame3 = Frame(my_notebook, width=1200, height=700)
#my_frame4 = Frame(my_notebook, width=1200, height=700)

my_frame1.pack(fill="both", expand=1, pady=20)
my_frame2.pack(fill="both", expand=1, pady=20)
my_frame3.pack(fill="both", expand=1, pady=20)
#my_frame4.pack(fill="both", expand=1)

my_notebook.add(my_frame1, text="Barcode")
my_notebook.add(my_frame2, text="Manual Code")
my_notebook.add(my_frame3, text="Inventory Jumbo")
#my_notebook.add(my_frame4, text="Code Generator")


# Creating LabelFrames

wrapper1 = LabelFrame(my_frame1, text="Items List")
wrapper2 = LabelFrame(my_frame1, text="Add and Remove")

wrapper4 = LabelFrame(my_frame2, text="Items List")
wrapper5 = LabelFrame(my_frame2, text="Add and Remove")

wrapper7 = LabelFrame(my_frame3, text="Items List")
wrapper8 = LabelFrame(my_frame3, text="Add and Remove")

#wrapper10 = LabelFrame(my_frame4, text="Items List")
#wrapper11 = LabelFrame(my_frame4, text="Command Bar")

#Packing the frames
wrapper2.pack(fill="both", expand="yes", padx=20, ipady=20)
wrapper1.pack(fill="both", expand="yes", padx=20, ipady=20)

wrapper5.pack(fill="both", expand="yes", padx=20, ipady=20)
wrapper4.pack(fill="both", expand="yes", padx=20, ipady=20)

wrapper8.pack(fill="both", expand="yes", padx=20, ipady=20)
wrapper7.pack(fill="both", expand="yes", padx=20, ipady=20)

#wrapper11.pack(fill="both", expand="yes", padx=20, ipady=10)
#wrapper10.pack(fill="both", expand="yes", padx=20, ipady=10)
#endregion

# TREEVIEW CREATION
#Treeview on frame 1
trv = ttk.Treeview(wrapper1, columns=(1,2,3,4,5,6,7), show="headings", height="15") #
trv.pack(fill="both",padx=20, ipady=10)

#Treeview on frame 2
trv_est = ttk.Treeview(wrapper4, columns=(1, 2, 3, 4, 5, 6, 7), show="headings", height="15") #
trv_est.pack(fill="both", padx=20, ipady=10)

#Treeview on frame 3
trv_jmb = ttk.Treeview(wrapper7, columns=(1, 2, 3, 4, 5, 6, 7), show="headings", height="15") #
trv_jmb.pack(fill="both", padx=20, ipady=10)


root.mainloop()

So I decided to use classes and function to make it easier. But I'm not able to figure it out how the hierarchy works. This is what I have so far:

from tkinter import *
from tkinter import ttk

root = Tk()
root.title('Codemy.com - Classes')
root.geometry("1000x600")

my_notebook = ttk.Notebook(root)
my_notebook.pack(pady=10, fill="both")

def btn_add():
    pass

class nt_book:

    def __init__(self, name_tab, num_frame):

        self.nome_aba = name_tab
        self.num_frame = num_frame

        self.num_frame = Frame(my_notebook, width=1200, height=700)
        self.num_frame.pack()

        my_notebook.add(self.num_frame, text=self.nome_aba)

    def wrap(self, name_wrap):
        self.name_wrap = name_wrap

        wrapper = LabelFrame(self.num_frame, text=self.name_wrap)
        wrapper.pack(fill="both", expand="yes", padx=20, ipady=20)


# Trying to call a tab and frames inside
est = nt_book("Inventory", "frame1")

est_fr1 = est.wrap("Command Bar")
est_fr2 = est.wrap("Item List")

add_btn = Button(est_fr1, text="Add", command=btn_add)
add_btn.grid(row=1, column=1, padx=10, pady=5)

root.mainloop()

What I really want to do:

  • Create a Class that adds a tab;
  • Create a Class - or function - that adds labelFrames to the tabs;
  • Create a Class - or function - that adds Buttons and Treeviews to the LabelFrames;

Actually I'm kind of lost on how to do it, I just don't want to copy and paste the same thing over and over again every time i want to create a new tab and add functionality to my program. I don't know if that's the case for inner classes or subclasses or even nested classes.

  • Have you seen [this discussion](https://stackoverflow.com/questions/17466561/best-way-to-structure-a-tkinter-application). Based on your question I would say you need to read more about [python classes](https://docs.python.org/3/tutorial/classes.html). If you want some good examples to look at after reading up on classes then [maybe looke here](https://python-textbok.readthedocs.io/en/latest/Introduction_to_GUI_Programming.html) – Rory Aug 24 '22 at 19:12
  • I am studying classes to code better, i had passed by that discussion, but my problem was on how tkinter interact with those concepts. But thank you for the information! – Leandro Bertarelli Aug 25 '22 at 17:20

1 Answers1

1

Does this work for you?

from tkinter import *
from tkinter import ttk

root = Tk()
root.title("Ges_Stock")
root.geometry("1000x600")


class BetterNotebook(ttk.Notebook):
    def add_frame(self, name):
        frame = BetterFrame(self, width=1200, height=700)
        frame.pack(fill="both", expand=1, pady=20)
        self.add(frame, text=name)


class BetterFrame(Frame):
    def __init__(self, parent, **kwargs):
        super().__init__(parent, **kwargs)
        self.add_remove_frame = LabelFrame(self, text="Add and Remove")
        self.add_remove_frame.pack(fill="both", expand="yes", padx=20, ipady=20)

        self.treeview_frame = LabelFrame(self, text="Item List")
        self.treeview_frame.pack(fill="both", expand="yes", padx=20, ipady=20)

        trv = ttk.Treeview(self.treeview_frame, columns=(1,2,3,4,5,6,7), show="headings", height="15")
        trv.pack(fill="both",padx=20, ipady=10)


my_notebook = BetterNotebook(root)
my_notebook.pack(pady=10, fill="both")

for x in ["Barcode", "Manual Code", "Inventory Jumbo"]:
    my_notebook.add_frame(x)


if __name__ == "__main__":
    root.mainloop()
dirrectZ
  • 56
  • 4
  • 1
    That's exactly what I've been Looking for! Thank you! I was trying to create a class within the class and it wasn't working. With this example I was able to figure the rest out! Thanks a lot! – Leandro Bertarelli Aug 25 '22 at 17:16