I am using customtkinter which is the exact same as tkinter but prettier.
how can I set the master of a tkinter frame class when the class inherits from the frame class in tkinter ??
my problem is because i want frame_right to be the master of wave_prop_inputs frame; which basically means, a frame inside a frame.
I tried using master=frame_right when making an object of the wave_prop_inputs class but that gave me the error init() got an unexpected keyword argument ‘master’
here is my main file:
import customtkinter as ctk import main import a_wave_prop.a_view as wave_prop from constants import TITLE, WIDTH, HEIGHT #Window Visuals ctk.set_appearance_mode("System") # Modes: "System" (standard), "Dark", "Light" ctk.set_default_color_theme("blue") # Themes: "blue" (standard), "green", "dark-blue" #Main Window class App(ctk.CTk): def __init__(self): super().__init__() self.title(TITLE) self.geometry(f"{WIDTH}x{HEIGHT}") self.protocol("WM_DELETE_WINDOW", self.on_closing) # call .on_closing() when app gets closed self.grid_columnconfigure(1, weight=1) self.grid_rowconfigure(0, weight=1) #Create Two Main Frames #Left Frame self.frame_left = main.main_left() self.frame_left.configure(width=180, corner_radius=0) self.frame_left.grid_rowconfigure(0, minsize=10) # empty row with minsize as spacing self.frame_left.grid_rowconfigure(8, weight=1) # empty row as spacing self.frame_left.grid(row=0, column=0, sticky="nswe") #Right Frame self.frame_right = main.main_right() self.frame_right.rowconfigure((1), weight=1) self.frame_right.columnconfigure((0, 1, 2, 3, 4, 5, 6, 7), weight=1) self.frame_right.grid(row=0, column=1, sticky="nswe", padx=10, pady=10) #Right Frame Children #wave_prop Inputs Frame self.wave_prop_inputs = wave_prop.inputs(master=self.frame_right) self.wave_prop_inputs.grid(row=0, column=0, columnspan=8, rowspan=1, pady=10, padx=10, sticky="nsew") def on_closing(self, event=0): self.destroy() if __name__ == "__main__": app = App() app.mainloop()
and here is my 2nd file:
import customtkinter as ctk class inputs(ctk.CTkFrame): def __init__(self): super().__init__() self.label_1 = ctk.CTkLabel(self, text="Incident Wave Inputs", text_font=("Roboto Medium", -24,)) self.label_1.grid(row=1, column=0, columnspan=2, sticky='W', pady=10, padx=10) self.label_2 = ctk.CTkLabel(self, text="Wave Height (H) = ", text_font=("Roboto Medium", -16)) self.label_2.grid(row=2, column=0, sticky='W', pady=10, padx=10) self.label_3 = ctk.CTkLabel(self, text="Water Depth (d) = ", text_font=("Roboto Medium", -16)) self.label_3.grid(row=3, column=0, sticky='W', pady=10, padx=10) self.label_4 = ctk.CTkLabel(self, text="Wave Period (T) = ", text_font=("Roboto Medium", -16)) self.label_4.grid(row=4, column=0, sticky='W', pady=10, padx=10) self.label_5 = ctk.CTkLabel(self, text="Wave Angle (u03B1) = ", text_font=("Roboto Medium", -16)) self.label_5.grid(row=2, column=2, sticky='E', pady=10, padx=10) self.label_6 = ctk.CTkLabel(self, text="Bed Slope (s) = ", text_font=("Roboto Medium", -16)) self.label_6.grid(row=3, column=2, sticky='E', pady=10, padx=10) self.label_7 = ctk.CTkLabel(self, text="Depth of Interest (z) = ", text_font=("Roboto Medium", -16)) self.label_7.grid(row=4, column=2, sticky='E', pady=10, padx=10) self.entry2 = ctk.CTkEntry(self, placeholder_text="meter", width=120, height=25, border_width=2, corner_radius=10) self.entry2.grid(row=2, column=1, sticky='W', pady=10, padx=10) self.entry3 = ctk.CTkEntry(self, placeholder_text="meter", width=120, height=25, border_width=2, corner_radius=10) self.entry3.grid(row=3, column=1, sticky='W', pady=10, padx=10) self.entry4 = ctk.CTkEntry(self, placeholder_text="second", width=120, height=25, border_width=2, corner_radius=10) self.entry4.grid(row=4, column=1, sticky='W', pady=10, padx=10) self.entry5 = ctk.CTkEntry(self, placeholder_text="degree", width=120, height=25, border_width=2, corner_radius=10) self.entry5.grid(row=2, column=3, sticky='W', pady=10, padx=10) self.entry6 = ctk.CTkEntry(self, placeholder_text="meter/meter", width=120, height=25, border_width=2, corner_radius=10) self.entry6.grid(row=3, column=3, sticky='W', pady=10, padx=10) self.entry7 = ctk.CTkEntry(self, placeholder_text="- meter", width=120, height=25, border_width=2, corner_radius=10) self.entry7.grid(row=4, column=3, sticky='W', pady=10, padx=10) self.button_6 = ctk.CTkButton(self, text="Calculate", command=self.button_event) self.button_6.grid(row=5, column=0, pady=10, padx=10, sticky="W") def button_event(self): print("Button pressed")
Advertisement
Answer
At this line you try to parse the keyword argument master:
wave_prop.inputs(master=self.frame_right)
To this class that does not expect any sort of arguments:
class inputs(ctk.CTkFrame): def __init__(self): super().__init__()
To enable this class to accept an argument with a default value you need to change it like this:
class inputs(ctk.CTkFrame): def __init__(self, master=None):
Last but not least you need to parse that value to your super class in order to make the super class use it.
super().__init__(master)
You should take a look at a basic tutorial about OOP to benefit by this concept more. In addition I suggest you to use the PEP-8 (Python Style Guide) see naming convention for classes for example. Your class looks like a method for a regular python developer.