Seite 1 von 1
Klassen Funktion aufrufen, Tkinter und Sqlite3 in einem
Verfasst: Mittwoch 10. Oktober 2012, 17:49
von anymagical
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
zu
ä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
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
Ich hoffe ich habe mich nicht allzu wirr ausgedrückt
Grüße
Anymagical
Re: Klassen Funktion aufrufen, Tkinter und Sqlite3 in einem
Verfasst: Mittwoch 10. Oktober 2012, 18:22
von 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.
Re: Klassen Funktion aufrufen, Tkinter und Sqlite3 in einem
Verfasst: Mittwoch 10. Oktober 2012, 18:37
von anymagical
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?
Re: Klassen Funktion aufrufen, Tkinter und Sqlite3 in einem
Verfasst: Mittwoch 10. Oktober 2012, 18:58
von 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.
Re: Klassen Funktion aufrufen, Tkinter und Sqlite3 in einem
Verfasst: Mittwoch 10. Oktober 2012, 19:32
von anymagical
Warum soll man es einfach machen wenn es auch umständlich geht
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