Klassen Funktion aufrufen, Tkinter und Sqlite3 in einem

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
anymagical
User
Beiträge: 33
Registriert: Montag 2. April 2012, 15:34

Hallo,

ich habe momentan folgenden Schnipsel:

Code: Alles auswählen

class Inputdialog(tkSD.Dialog):
    
    def body(self, master):
        tk.Label(master, text="Nummer:", font="Arial 14").grid(row=0)
        tk.Label(master, text="Name:", font="Arial 14").grid(row=1)
        self.input1 = tk.Entry(master)
        self.input2 = tk.Entry(master)
        self.input1.grid(row=0, column=1)
        self.input2.grid(row=1, column=1)

    def apply(self):
        try:
            self.position = int(self.input1.get())
            self.name = str(self.input2.get())
            print(self.position, self.name)
        except UnicodeEncodeError:
            Messages().encodewarning()
        except ValueError:
            Messages().valuewarning()
wenn ich von einer Hauptklasse: Inputdialog() aufrufe wird body und apply automatisch ausgeführt. Wieso macht es dies?

Wenn ich die

Code: Alles auswählen

def apply
zu

Code: Alles auswählen

def appl
ändere wird der Teil nicht mehr automatisch ausgeführt. Wie kann ich die Funktion Inputdialog().appl dann aufrufen sodass sie gleich laufen würde wie jetzt? Die Klasse Inputdialog wird von einer anderen Klasse von zwei verschiedenen Methoden aufgerufen und sollte deshalb 2 verschiedene Aufgaben erfüllen.

Das ganze soll eine Oberfläche werden welche Nr und Name in eine DB einträgt. Wie wäre es mir möglich die DB komfortabel mehrzeilig

Code: Alles auswählen

Nr name        Nr name        Nr name
auszudrucken? Die sqlite3 DB scheint mir dafür nicht sehr geeignet zu sein. Würde sich das schreiben in eine Exceldatei dafür besser anbieten? Das ganze muss natürlich unter einem Windoof laufen :D

Ich hoffe ich habe mich nicht allzu wirr ausgedrückt

Grüße
Anymagical
BlackJack

@anymagical: Die Methoden werden aufgerufen weil das halt so dokumentiert ist. Das ist das „template pattern”. Es wird ein gewisser Rahmen vorgegeben und man kann einzelne Methoden überschreiben, die dann vom vorhandenen Code in der dokumentierten Art und Weise aufgerufen/verwendet werden. Und hier ist das eben so, dass die `body()`-Methode den Inhalt des Dialogs definieren soll und die `apply()`-Methode aufgerufen wird, wenn der Benutzer den Dialog mit `Ok` quittiert.

Wenn die Klasse für zwei *verschiedene* Aufgaben verwendet werden soll, dann sollten es vielleicht auch zwei verschiedene Klassen sein.

``Messages().encodewarning()`` und ``Messages().valuewarning()`` sehen mir übrigens nach „code smells” aus. Das ist ziemlich sicher kein guter Entwurf ein Objekt ohne Argumente zu erstellen um darauf dann eine Methode ohne Argumente aufzurufen. Welche Daten werden denn da mit Funktionen zu einem Objekt zusammen gefasst? Denn *dafür* sind Klassen gedacht.

Was hat die Datenbank mit der Ausgabe zu tun? Ob Du Nummer und Namen in SQLite, MySQL, Postgres, oder sonst einem relationalen DBMS, oder in einer Textdatei, oder einer „NoSQL”-DB speicherst ist doch völlig unabhängig davon wie Du die Daten ausgibst oder druckst‽

Ist hier wirklich drucken gemeint, also über einen Drucker auf Papier? Dann wäre ein GUI-Toolkit was auch eine API für Ausdrucke bietet vielleicht besser geeignet als `Tkinter`. Oder Du erstellst eine Ausgabedatei in einem Format, welches sich drucken lässt, wie beispielsweise HTML oder PDF.
anymagical
User
Beiträge: 33
Registriert: Montag 2. April 2012, 15:34

Code: Alles auswählen

import tkMessageBox as tkMB
class Messages():
    def valuewarning(self):
        #ValueError
        tkMB.showerror("Error","")
    def encodewarning(self):
        # UnicodeEncodeError
        tkMB.showerror("Error","")
    def notfound(self):
        # Searchmessage
        tkMB.showwarning("Nicht vorhanden","")
    def double(self):
        #double entry
        tkMB.showwarning("Eintrag vorhanden","")
So sieht die Klasse aus welche die Messages enthält, könnte man sich im Prinzip auch sparen und je nach Error direkt den entsprechenden Dialog aufrufen. Aber da an mehreren Stellen exceptions sind und ich nicht mit C&P arbeiten wollte dachte ich mir eine extra Klasse für Mitteilungen zu erstellen.

2 verschiedene Aufgaben 2 Klassen das habe ich auch so gehandhabt wollte da sie sich recht ähnlich aussehen sie eventuell zusammenfassen.
Ist hier wirklich drucken gemeint, also über einen Drucker auf Papier? Dann wäre ein GUI-Toolkit was auch eine API für Ausdrucke bietet vielleicht besser geeignet als `Tkinter`. Oder Du erstellst eine Ausgabedatei in einem Format, welches sich drucken lässt, wie beispielsweise HTML oder PDF.
Ja hier ist wirklich ducken gemeint. Drucken auf ein weißes Papier und das möglichst effizent. Hätte ich wenn ich das Ausgabeformat in Html wähle den gleichen Komfort wie in sqlite3 z.B nach Einträgen suchen oder nach festgelegten Regeln zu sortieren?
BlackJack

@anymagical: Die Klasse `Messages` erfüllt doch hier überhaupt keinen Sinn‽ Keine der „Methoden” benötigt hier irgendwelche Daten die zu dem Objekt gehören. Das könnte man genau so gut als Funktionen definieren ohne die unnötige Klasse als Zwischenschritt.

Das Ausgabeformat hat nichts mit der Datenhaltung zu tun. Das ist für die *Ausgabe* da und beeinflusst weder die Datenhaltung noch die Abfrage und Aufbereitung der Daten zu einem Ergebnis. Wenn Du an dem Punkt bist wo Du Daten ausgeben willst, müssen die schon vorhanden sein. Ohne die gewünschten Daten in der gewünschten Sortierung *vorliegen* zu haben, kann man doch nichts ausgeben — egal ob nun als HTML, PDF, oder direkt über eine Druck-API.
anymagical
User
Beiträge: 33
Registriert: Montag 2. April 2012, 15:34

Warum soll man es einfach machen wenn es auch umständlich geht :D

Vielen Dank für deine Tips und Antworten. Werde dsa ganze mal anpassen und probieren über eine html oder pdf datei komfortabel druckbar zu machen.

Gruß
Anymagical
Antworten