Customtkinter "master" Parameter beim erstellen von einem Textfeld?

1 Antwort

Deine Vererbungsstrukturen erscheinen etwas chaotisch. Um das also einmal vorauszunehmen: Solltest du dich hinsichtlich der objektorientierten Programmierung noch nicht auskennen, wäre es vorteilhaft, sich erst einmal diesem Thema zu widmen, bevor du mit CustomTkinter weitermachst.

1) Ich sehe keinen Sinn, wieso die Main-Klasse von view.MainWindow erben sollte. Sie repräsentiert kein Fensterobjekt. Sie besitzt lediglich ein Attribut (main_window), welches ein view.MainWindow-Objekt hält.

Auch für InputBoxMain solltest du die Hierarchie überdenken.

2) Im gesamten Programm sollte es nur einen einzigen Root (zeitgleich die oberste Komponente) geben. Du erstellst in InputBoxMain bereits einen zweiten. Das window-Attribut von MainWindow verweist auf den ersten Root.

3) Die set_size-Methode von InputBoxTemplate tut nicht das, was ihr Name verspricht. In ihr versuchst du, die Komponente an eine bestimmte Position zu verschieben. Außerdem vergibst du der place-Methode dabei falsche Argumente.

Richte die Komponente am besten gleich nach dem Erstellen mit pack aus.

self.box.pack(padx=x, pady=y)

Die Größe des Feldes kannst du entweder über Argumente des Konstruktors bestimmen oder nachträglich via configure:

self.box.configure(width=width)
self.box.configure(height=height)

Wirf diesbezüglich auch einen Blick in die Dokumentation.

4) Bei _placeholder_text handelt es sich um ein Attribut, keine Methode. Auch hier gilt: Wenn du dessen Wert nachträglich ändern möchtest, nutze configure.

self.box.configure(placeholder_text=f"{placeholder}")

5) Mit dem master gibst du das Parent Widget (die Elternkomponente) für ein Widget an.

In deinem Fall soll das Eingabefeld in dein Hauptfenster gehängt werden. Demzufolge müsstest du dir in Main das Rootobjekt der MainWindow-Instanz holen und sie an InputBoxMain weitergeben.

controller.InputBoxMain(self.main_window.get_window())

Der Konstruktor von InputBoxMain muss demzufolge um einen Parameter ergänzt werden. Dessen Wert wird an den Konstruktor von InputBoxTemplate überreicht.

def __init__(self, master):
  self.window = view.InputBoxTemplate(master)
  # etc. ...

Dort kannst du das empfangene Objekt nutzen, um das Eingabefeld zu kreieren.

def __init__(self, master):
  self.box = ctk.CTkEntry(master=master)