GUI-aufbau mit klassen

Fragen zu Tkinter.
Antworten
Gerjay
User
Beiträge: 7
Registriert: Montag 30. November 2015, 22:08
Wohnort: Wien

hallo leute,

stelle gerade eine app fertig (python/sqlite/raspbian/touchscreen), in der ich mit klassen arbeite. für mich ist das neu und auch das konzept der OOP sitzt noch nicht so richtig, daher hab ich mich im internet umgesehen und bin dem ratschlag gefolgt, jedes window in eine eigene class zu packen.

nun würde ich gerne folgendes wissen:
1. ist das immer noch state of the art, oder schon komplett retro? wie könnte eine alternative aussehen, oder kann man das getrost so belassen?
2. nach programmstart werden zahlreiche daten aus der DB geholt und in variablen gespeichert. auf diese variablen müssen dann alle klassen zugreifen können. passiert das variablenholen in einer eigenen klasse oder ganz ohne class?

danke im voraus!
gerald
BlackJack

@Gerjay: GUIs in Klassen zu strukturieren ist immer noch State of the Art. Auch wenn vieles aus den 70ern heute Retro erscheint, das ist von damals geblieben. ;-)

Was das „Variablen holen“ angeht kann man so allgemein nicht sagen ob man dazu Klassen braucht oder Funktionen reichen, aber das alle Klassen auf die (alle?) Variablen zugreifen müssen klingt eigenartig bis gar nicht gut.
Gerjay
User
Beiträge: 7
Registriert: Montag 30. November 2015, 22:08
Wohnort: Wien

retro ist das neue state of the art :)

ich hab vergessen zu erwähnen, dass die app eintrittskarten ausdruckt. so eine art registrierkasse für veranstaltungen.
die variablen aus der DB werden in (fast) allen klassen benötigt, weil sie infos über den veranstalter (name, adresse usw), den veranstaltungsort (name, adresse usw) und den event (name, mwst usw) enthalten. da jedes window eine eigene class ist (ticket verkaufen, ticket stornieren, zwischenstand ausgeben, admin-tools usw) brauch ich die eben überall.

meine herangehensweise wäre diese DB-abfragen noch vor dem ganzen OOP-zeugs zu erledigen - ganz ohne funktionen oder klassen.
aber was weiss ich schon :K
BlackJack

@Gerjay: Ganz ohne Funktionen und Klassen geht nicht. Funktionen sollten ausser auf Konstanten ja schon nicht auf Werte zugreifen die nicht als Argumente übergeben wurden. Das hat noch nicht einmal was mit OOP zu tun. Gilt dann aber für Methoden natürlich auch. Auf Modulebene gehört nur Code der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@Gerjay: Du willst doch nicht alle Daten im Speicher behalten? Und wann willst Du die Änderungen wieder schreiben? State-Of-The-Art ist für die Datenbankabstraktion ein Objektmodel (SQLAlchemy) zu haben und entweder eine Funktion zu haben, die eine Session erzeugt, oder eine Session zwischen den Fenstern herumzureichen, mit Präferenz auf ersterem.
Gerjay
User
Beiträge: 7
Registriert: Montag 30. November 2015, 22:08
Wohnort: Wien

vielen dank für eure antworten!

ich dachte, dass ich die stammdaten (name, adresse usw) - und nur diese - einmal aus der DB einlese und das diese unverändert als variablen allen klassen zur verfügung stehen. das buchen/stornieren der tickets wo auch jede menge DB-abfragen und variablen im spiel sind passiert dann in den jeweiligen klassen.

mein laienhafter zugang wäre folgender:

import tkinter as tk
...
db-queries
variable1
variable2
...
class 1
class 2
usw
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@Gerjay: vielleicht habe ich noch nicht vollständig verstanden, was Du vorhast. Daher meine etwas banale Frage: Warum willst Du Namen und Adresse anders behandeln, als andere Daten?

Generell haben Variablen auf Modulebene nichts verloren. Wie sieht denn Dein jetziger Datenbankentwurf aus? Welche Abfragen hast Du Dir vorgestellt?
Gerjay
User
Beiträge: 7
Registriert: Montag 30. November 2015, 22:08
Wohnort: Wien

@Sirius3:
das programm ist für die abendkasse von kultureinrichtungen gedacht, d.h. gleich nach programmstart werden einstellungen vorgenommen (in dictionaries), die für die ganze laufzeit gleich bleiben werden: veranstalter (name, adresse, mwst-id usw), event (titel, datum, preise usw) und veranstaltungsort (name, adresse usw). genau diese daten müssen beim drucken der eintrittskarte immer vorhanden sein.
meine DB-abfragen, die bei JEDEM verkauf eines tickets durchgeführt werden beziehen sich, grob gesagt, auf das aktualisieren des umsatzzählers und der gästezahl. ich wollte der DB das ständige abfragen der stammdaten ersparen, aber vielleicht ist das gar nicht best practice.

ich würde gerne wissen, wie man mit solchen unveränderlichen stammdaten umgeht. einmal einlesen und über die gesamte laufzeit in variablen speichern oder bei jedem ticketverkauf aufs neue reinholen?

schon mal besten dank im voraus!!!
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@Gerjay: am Besten schreibst Du eine Klasse, bei der es egal ist, ob das eine oder das andere. Dann fängst Du mit den einfacheren an (jedes mal die Daten von der Datenbank holen) und nur wenn das unerträglich langsam ist, würde ich Zeit in eine Speicherlösung stecken.
Gerjay
User
Beiträge: 7
Registriert: Montag 30. November 2015, 22:08
Wohnort: Wien

DANKE!
Antworten