I’m new to Tkinter and OOP. I’ve been trying to make child class inherit some methods from parent class because I’d have repeated code if I didn’t do it like that. But I’ve stumbled on a problem, caused probably by my limited knowledge of Tkinter and OOP.
Here is my code: (it’s really simplified, but it is enough to solve problem in complete build):
main.py
from app import App import tkinter as tk if __name__ == "__main__": root = tk.Tk() root.title("Title") root.minsize(300, 300) App(root).pack(side="top", fill="both", expand=True) root.mainloop()
app.py
import tkinter as tk from tkinter import ttk from smalerscale.test import FormFill class App(tk.Frame): def __init__(self, parent, *args, **kwargs): tk.Frame.__init__(self, parent, *args, **kwargs) self.parent = parent # notebook variable self.notebook = ttk.Notebook(self) self.note1 = FormFill(self) self.notebook.add(self.note1, text='From') self.notebook.pack()
form_parent.py
import tkinter as tk from tkinter import ttk class FormParent(tk.Frame): """Form frame """ def __init__(self, parent, *args, **kwargs): tk.Frame.__init__(self, parent, *args, **kwargs) self.parent = parent self.main_message = tk.Label(self, text="Some text").pack(fill='x', padx=50, pady=5) def print_something(self): print(self.main_message)
test.py
import tkinter as tk from tkinter import ttk class FormFill(FormParent): def __init__(self, parent, *args, **kwargs): tk.Frame.__init__(self, parent, *args, **kwargs) super().__init__(self) print("It works maybe!") self.print_something()
And this is the error I get (something gets printed out, but no window appears):
It works maybe! None Traceback (most recent call last): File "C:/Users/kryst/PycharmProjects/covidForm/smalerscale/main.py", line 8, in <module> App(root).pack(side="top", fill="both", expand=True) File "C:UserskrystPycharmProjectscovidFormsmalerscaleapp.py", line 17, in __init__ self.notebook.add(self.note1, text='Formulář') File "C:UserskrystAnaconda3libtkinterttk.py", line 844, in add self.tk.call(self._w, "add", child, *(_format_optdict(kw))) _tkinter.TclError: can't add .!app.!formfill.!formfill as slave of .!app.!notebook
I’m pretty sure I messed up the __init__
and some attributes, but I can’t find a way to make it right and working.
I’d be really grateful for any help.
Advertisement
Answer
Working answer by @JacksonPro
tk.Frame.__init__(self, parent, *args, **kwargs) super().__init__(self) in FormFill class -> super().__init__(parent, *args, **kwargs)