Python programmieren, Objektorientierte Programmierung in verschiedenen Dateien mit Klassen?


16.07.2024, 16:27

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

Woher ich das weiß:Hobby

LDM158 
Beitragsersteller
 16.07.2024, 16:29

Ja tatsächlich klappt das, nur wo war jetzt mein Fehler? :)

0
derITprofi  16.07.2024, 16:37
@LDM158

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.

1
LDM158 
Beitragsersteller
 16.07.2024, 16:45
@derITprofi

Vielen lieben Dank! Das hilft mir um einen kleinen Schritt weiter nach vorne zu gelangen. :)

1