Python programmieren, Objektorientierte Programmierung in verschiedenen Dateien mit Klassen?
Hey,
ich lerne aktuell Python und habe angefangen einen Chatbot zu programmieren.
Nun will ich anfangen mir anzugewöhnen in verschiedenen Dateien mit Objektorientierter Programmierung zu programmieren bzw. das erstmal zu lernen.
Mein Gedanke in meinem Code ist z.B. eine Klasse WindowTemplate zu erstellen und diese als Blaupause ohne vorgegebene Werte zu definieren.
An Sich gelingt mir das auch aber ich habe Probleme von einer anderen Klasse aus einer anderen Datei darauf zuzugreifen und die Werte für wie zum Beispiel Größe oder Titel zu übergeben.
Ich würde mich freuen wenn hier mal jemand der etwas Erfahrung hat drauf schauen könnte und mich zumindest mal in die richtige Richtung leiten kann. :)
Viele Dank!
main.py
Fehlermeldung ist diese:
Traceback (most recent call last):
line 17, in <module>
app = Main()
^^^^^^
line 9, in __init__
self.main_window.set_size("1680", "900")
line 10, in set_size
self.window_size.geometry(f"{width}x{height}")
^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'geometry'
import view
import customtkinter as ctk
class Main(ctk.CTk):
def __init__(self):
super().__init__()
self.main_window = view.WindowTemplate()
self.main_window.set_size("1680", "900")
self.main_window.set_title("YourTerminal")
def my_mainloop(self):
self.mainloop()
if __name__ == "__main__":
app = Main()
app.my_mainloop()
view.py
import customtkinter as ctk
class WindowTemplate:
def __init__(self, window_size=None, window_title=None):
self.window_size = window_size
self.window_title = window_title
def set_size(self, width, height):
self.window_size.geometry(f"{width}x{height}")
def set_title(self, title):
self.window_title.title(title)
Hier auch nochmal meine Fehlermeldung.
Traceback (most recent call last):
line 17, in <module>
app = Main()
^^^^^^
line 9, in __init__
self.main_window.set_size("1680", "900")
line 10, in set_size
self.window_size.geometry(f"{width}x{height}")
^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'geometry'
1 Antwort
view.py
import customtkinter as ctk
class WindowTemplate:
def __init__(self):
self.window = ctk.CTk()
def set_size(self, width, height):
self.window.geometry(f"{width}x{height}")
def set_title(self, title):
self.window.title(title)
def get_window(self):
return self.window
main.py
import view
import customtkinter as ctk
class Main:
def __init__(self):
self.main_window = view.WindowTemplate()
self.main_window.set_size("1680", "900")
self.main_window.set_title("YourTerminal")
def run(self):
self.main_window.get_window().mainloop()
if __name__ == "__main__":
app = Main()
app.run()
lass mich wissen ob das funktioniert
Dein Fehler war in der WindowTemplate Klasse in der view.py
in deiner Version hast du kein tatsächliches Fenster Objekt erstellt. Du hattest
def __init__(self, window_size=None, window_title=None):
self.window_size = window_size
self.window_title = window_title
Das initalisierte lediglich zwei Attribute mit None, aber erstelle kein Fenster.
Dann hast du noch eine nicht existierende Attribute benutzt, bei deiner Methode set_size und set_title versuchstest du, Methoden auf self.window_size und self.window_title aufzurufen, die None waren:
def set_size(self, width, height):
self.window_size.geometry(f"{width}x{height}")
def set_title(self, title):
self.window_title.title(title)
Da die auf None waren führte das zum AttributeError
Um das Problem zu beheben mussten wir ein tatsächliches Fenster-Objekt in WindowTemplate erstellen.
Die Methoden so anpassen, dass die mit diesem Fenster-Objekt arbeiten.
eine Methode hinzufügen, um auf das Fenster-Objekt zuzugreifen.
Das ermöglicht dir die WindowTemplate-Klasse als eine Art "Wrapper" für ein ctk.CTk-Fenster zu verwenden was dein Ziel war, eine wiederverwendbare Vorlage zu erstellen.
Vielen lieben Dank! Das hilft mir um einen kleinen Schritt weiter nach vorne zu gelangen. :)
Ja tatsächlich klappt das, nur wo war jetzt mein Fehler? :)