Darf man fragen, was die Verrenkungen in "BeerConfig.__init__()" zum Zweck haben? Eine Bibliotheksklasse sollte
niemals globale Änderungen zur Folge haben (in diesem Fall die Manipulation des Arbeitsverzeichnisses), zumal du ein paar Zeilen weiter unten doch zeigst, dass du eigentlich weißt, wie man es richtig macht (in dem man absolute Pfade mit "os.path.join()" erzeugt). Außerdem existiert "ConfigParser.read()", so dass du dir den Test auf Existenz auch sparen kannst (der sowieso nicht atomar ist, im schlimmsten Fall leert diese Chose daher die Konfigurationsdatei). Die Ausgabe mit "print" gehört da übrigens ebenfalls nicht hin, Ausgaben aus Bibliotheksklassen sind allenfalls per "logging" ok.
Desweiteren sollte "BeerConfig.beers()" einen Generator zurückgeben, die Liste ist an dieser Stelle schließlich noch nicht nötig. Außerdem würde ich daraus vielleicht eine Eigenschaft und keine Methode machen.
Das Speichern der Konfigurationsdatei hat in "BeerConfig.add_beer()" imho nichts zu suchen, ich würde dafür eine separate Methode erzeugen. Außerdem ist eine Konfigurationsdatei keine Binärdatei, im Mindestens aber solltest du dich für eine der beiden Möglichkeiten entscheiden. Binär speichern und als Text lesen macht Probleme unter Windows. Die Ausnahmebehandlung ist an dieser Stelle imho unelegant, der Einsatz von "ConfigParser.has_section()" würde an dieser Stelle zwei Codezeilen sparen, die keinen Mehrwert bringen und die Lesbarkeit eher verringern.
Im Bezug auf den eigentlichen Fehler solltest du dir in der Beschreibung dieser Eigenschaft mal ganz genau durchlesen, wie die dazugehörigen Getter und Setter wirklich heißen. Für den Aufruf von ".setFixedSize()" in "MainWindow.__init__()" sollte man dich eigentlich hauen
, eine vernünftige GUI nutzt Layoutmanagement. Die explizite Konvertierung zu "QString()" in Zeile 25 von "beerconf_gui" ist iirc nicht nötig, allerdings bin ich mir da nicht sicher, dass müsstest du ausprobieren. Die UI-Datei per Konstruktor zu übergeben, ist imho keine gute Idee, die UI ist schließlich elementarer Bestandteil des Objekts und eigentlich keine Sache, die der Nutzer der Klasse konfigurieren sollte. Ich würde den Pfad zur UI-Datei in ein Klassenattribut stecken. Und außerdem einen absoluten Pfad dafür nutzen, nicht immer liegt die UI-Datei im aktuellen Arbeitsverzeichnis. So gesehen ist es reines Glück, dass du "BeerConfig" erst
nach dem Laden der UI erzeugst, andersrum knallst nämlich (siehe oben).
Btw, du darfst auch "Schleife" sagen