Agregar tabs de cuaderno en tkinter: ¿cómo lo hago con una estructura basada en clases? (Python 3)

Escribí una aplicación tkinter que tenía widgets mostrados en dos marcos, similar a este ejemplo, que se ejecuta con éxito.

from tkinter import * from tkinter import ttk root = Tk() root.title("Example") notebook = ttk.Notebook(root) frame1 = ttk.Frame(notebook) frame2 = ttk.Frame(notebook) notebook.add(frame1, text="Frame One") notebook.add(frame2, text="Frame Two") notebook.pack() #(The labels are examples, but the rest of the code is identical in structure). labelA = ttk.Label(frame1, text = "This is on Frame One") labelA.grid(column=1, row=1) labelB = ttk.Label(frame2, text = "This is on Frame Two") labelB.grid(column=1, row=1) root.mainloop() 

Decidí que debía tratar de reestructurar el progtwig para usar una clase (con la cual, ciertamente, no estoy muy familiarizado). Sin embargo, no estoy seguro de qué debo hacer para permitir que los widgets aparezcan en diferentes marcos (todo lo demás funciona bien). Por ejemplo, lo siguiente produce un “TypeError: init () toma de 1 a 2 argumentos posicionales pero se dieron 3″. Por lo tanto, presumiblemente necesitaría iniciar con un argumento adicional, pero no estoy seguro de cómo se trabajaría el cuaderno en eso, o si ese es incluso el enfoque que debería estar tomando. (El progtwig se ejecutará si los argumentos “marco1” y “marco2” se eliminan de las tags, sin embargo, mostrará lo mismo en ambos marcos).

 from tkinter import * from tkinter import ttk class MainApplication(ttk.Frame): def __init__(self, parent): ttk.Frame.__init__(self, parent) self.labelA = ttk.Label(self, frame1, text = "This is on Frame One") self.labelA.grid(column=1, row=1) self.labelB = ttk.Label(self, frame2, text = "This is on Frame Two") self.labelB.grid(column=1, row=1) root = Tk() root.title("Example") notebook = ttk.Notebook(root) frame1 = ttk.Frame(notebook) frame2 = ttk.Frame(notebook) notebook.add(frame1, text="Frame One") notebook.add(frame2, text="Frame Two") notebook.pack() MainApplication(root).pack() root.mainloop() 

Me interesa una solución, pero también me interesa saber qué hace la clase de manera diferente en comparación con los widgets independientes.

Esta sería una forma de generalizar la aplicación como una clase. Quieres eliminar el código repetido.

 from tkinter import * from tkinter import ttk class Notebook: def __init__(self,title): self.root = Tk() self.root.title(title) self.notebook = ttk.Notebook(self.root) def add_tab(self,title,text): frame = ttk.Frame(self.notebook) self.notebook.add(frame,text=title) label = ttk.Label(frame,text=text) label.grid(column=1,row=1) self.notebook.pack() def run(self): self.root.mainloop() nb = Notebook('Example') nb.add_tab('Frame One','This is on Frame One') nb.add_tab('Frame Two','This is on Frame Two') nb.run() 

Le sugiero que divida los diferentes marcos dentro del cuaderno en archivos separados. Utilicé desde tab2 import * porque quería que esto permaneciera en el espacio de nombres sin agregar el prefijo de archivo / clase, es decir. No quería escribir: tab1.Tab1 (cuaderno)

main.py

 import tkinter as tk from tkinter import ttk from tab1 import * from tab2 import * class MainApplication(tk.Frame): def __init__(self, parent, *args, **kwargs): tk.Frame.__init__(self, parent, *args, **kwargs) notebook = ttk.Notebook(parent) Tab1frame = Tab1(notebook) Tab2frame = Tab2(notebook) notebook.add(Typ1frame, text='TAB1') notebook.add(Typ2frame, text='TAB2') notebook.pack() if __name__ == "__main__": root = tk.Tk() MainApplication(root).pack(side="top", fill="both", expand=True) root.mainloop() 

tab1.py

 import tkinter as tk from tkinter import ttk class Typ14(tk.Frame): def __init__(self, parent, *args, **kwargs): tk.Frame.__init__(self, parent, *args, **kwargs) shell_frame=tk.LabelFrame(self, text="Sample Label Frame", padx=5,pady=5) shell_frame.grid(row=0,column=0,padx=5,pady=5)