Python Forum

Full Version: Tkinter: multitab window
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Hi, I'm trying to use multitab frame in my script. My plan is to create the pages I need in different .py then use this as main page to start my program

from tkinter import *
from Page1 import *
from Page2 import *
from Page3 import *class App(Tk):

    def __init__(self,*args,**kwargs):
       Tk.__init__(self,*args,**kwargs)
       self.notebook = ttk.Notebook()
       self.add_tab()
       self.notebook.grid(row=0)
  
    def add_tab(self):
        tab1 = Instructions(self.notebook)
        tab2 = Mainframe(self.notebook)
        tab3 = Test(self.notebook)
        self.notebook.add(tab,text="p1")
        self.notebook.add(tab2,text="p2")
        self.notebook.add(tab3,text="p3")
  
  
class Page1(Frame):
   def __init__(self,name,*args,**kwargs):
       Frame.__init__(self,*args,**kwargs)
        self.name = name
  
class Page2(Frame):
   def __init__(self,name,*args,**kwargs):
       Frame.__init__(self,*args,**kwargs)
       self.name = name
       
class Page3(Frame):
   def __init__(self,name,*args,**kwargs):
       Frame.__init__(self,*args,**kwargs)
       self.name = name
  
my_app = App()
my_app.mainloop()
but when I try to make it run all pages appear in different windows and only after I close them finally appear the window with my tab (that are empty). How can I fix this?

This is my first page code:
from openpyxl import *
from tkinter import *
from datetime import datetime
wb = load_workbook('C:\\Users\\MyPC\\Desktop\\\\exc.xlsx')

sheet = wb.active
datetimeFormat = '%d-%m-%Y'
class Page1(Frame):

   def __init__(self,master,*args,**kwargs):
       global msg, inv_cnt
       excel()
       inv_cnt=1

       Frame.__init__(self,master,*args,**kwargs)

   #label
   #entry

class App(Tk):
   def __init__(self):
       global value
       Tk.__init__(self)
       self.title("Fake News Survey")
       self.geometry('400x500')
       self.resizable(0,0)
               # create and pack a Mainframe window
       Mainframe(self).place(x=0,y=0,height=880,width=880)
       self.mainloop()
and my second one
from tkinter import *
window=Tk()


S = Scrollbar(window)
T = Text(window, padx = 10, pady = 10, spacing1 = 10, spacing2 = 1, bd = 2)
S.pack(side=RIGHT, fill=Y)
T.pack(side=LEFT, expand=True, fill=BOTH)
S.config(command=T.yview)
T.config(yscrollcommand=S.set, background="LIGHT GRAY")
T.tag_configure('big', font=('times', 15, 'bold'), justify='center')
T.tag_configure('normal', font=('times', 12))
T.insert(END,'Instructions\n', 'big')
quote = """Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin id augue tempor lectus ornare mollis at sed felis."""
T.insert(END, quote, 'normal')
T.config(state=DISABLED)

window.title('PAGE2')
window.geometry("400x500")
window.mainloop()
Basically I don't know how to format my page to be able to fit in the multitab and how to call it in my main page. Also how could I disable a tab and then able it after the use of a button?
Thank to whoever could help me Smile
You need to write the pages using a common API. This can be as simple an init and a way to get the page and maybe the title.

Notobook module
import tkinter as tk
from tkinter import ttk

import page1
import page2

class Paper(tk.Tk):
    def __init__(self):
       super().__init__()
       self.title("Daily Paper")
       
       self.notebook = ttk.Notebook(self)
       self.notebook.pack(fill='both')
       self.add_page(page1.Page1)
       self.add_page(page2.Page2)
   
    def add_page(self, page_cls):
        page = page_cls(self.notebook)
        self.notebook.add(page.frame, text=page.title)
   
my_app = Paper()
my_app.mainloop()
Page module
import tkinter as tk

headlines = ('Covid Cured', 'Economy Rebounds', 'Global Warming Reversed', 'World Peace')
 
class Page1:
    def __init__(self, parent):
        self.title = 'Headlines'  # Tab title in notebook
        self.frame = tk.Frame(parent) # Tab conents
        for i, text in enumerate(headlines):
            story = tk.Label(self.frame, text=text)
            story.grid(row=i, column=0)
May as well have two pages:
import tkinter as tk

sports = ('Hockey', 'Baseball', 'Soccer', 'Football', 'Basketball')
 
class Page2:
    def __init__(self, parent):
        self.title = 'Sports'
        self.frame = tk.Frame(parent)
        for i, text in enumerate(sports):
            story = tk.Label(self.frame, text=text)
            story.grid(row=i, column=0)
The notebook will automatically resize to fit the largest page, and the main window automatically resizes to fit the notebook.

It should be pretty easy to automate filling the notebook with pages. You could put all the page modules in a folder and the notebook module would open scan the folder, import the page modules, and add the page. The contents of the pages themselves could be automated.
Thank you for your help! I'm having a little bit of trouble understending how to implementing the code/ using class.
This is how I've changed the code of my page2
class page2:
    def __init__(self, parent):
        self.title = 'Head'
        self.frame = tk.Frame(parent)
        for i, text in enumerate(head):
            story = tk.Label(self.frame, text=text)
            story.grid(row=i, column=0)

        self.scrollbar = Scrollbar(self)
        self.text = Text(self, padx = 10, pady = 10, spacing1 = 10, spacing2 = 1, bd = 2)
        self.scrollbar.pack(side=RIGHT, fill=Y)
        self.text.pack(side=LEFT, expand=True, fill=BOTH)
        self.scrollbar.config(command=self.text.yview)
        self.text.config(yscrollcommand=self.scrollbar.set, background="LIGHT GRAY")
        self.text.tag_configure('big', font=('times', 15, 'bold'), justify='center')
        self.text.tag_configure('normal', font=('times', 12))
        self.text.insert(END,'Instructions\n', 'big')
        quote = """Lorem ipsum dolor sit amet, consectetur adipiscing elit."""
        self.text.config(state=DISABLED)
And it's not working.But my even bigger problem is how should I change page1 class to make it works.
Thank you again for your help
What do you mean by "not working". Does the code not run or don't you see the page in your notebook? Are you not getting a tab for the page? More information please.