OOP Fragen

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.
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Mädels/Frauen/Jungs/Männer
ich weiß ja nicht was ihr alle seit.

Ich hab es schon begriffen was ihr mir sagen wollt, ich seh manchmal den Wald vor lauter Bäumen nicht
das geb ich zu.
Für mich ist es eher eine Umstellung da es eine für mich neue Sprache ist obwohl
sie doch recht simple manchmal ist aber dann auch wieder nicht und das ganze gepaart mit OOP
is schon anstrengend.

Ich hatte heute alleine 4 Endlosschleifen gehabt die nicht mehr beendet konnte. Der PC
war komplett lahm gelegt und da war nix mit Entwicklungsumgebung schnallt das und beendet es
von alleine wie sonst auch. Gelöst hab ich es dann alleine. Bzw. Schritt für Schritt getestet wo
die Schleife her kommt.

Außerdem bin ich eher froh das es hier im Forum genug Leute gibt die einem helfen, auch wenn
ihre Antworten meist so geil umschrieben sind das man 5 mal drüber nachdenken muss damit
man versteht was sie einem damit sagen wollen.

Erneut bitte ich um Nachsicht über meine Unwissenheit, denn jeder hat mal klein angefangen ;)

Ps.: Ich hab heute noch kein neues Thread erstellt um euch mit Fragen und Problemen zu belästigen :D

PPs.: Seht das bitte als spaß an ;)

PPs.: Außerdem is Freitag.........
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Kalli87 hat geschrieben:Ich hatte heute alleine 4 Endlosschleifen gehabt die nicht mehr beendet konnte. Der PC
war komplett lahm gelegt und da war nix mit Entwicklungsumgebung schnallt das und beendet es
von alleine wie sonst auch.
Ich habe noch auf jedem meiner Rechner auf allen Systemen jede Endlosschleife beenden können (von unechten Dingern wie Fork-Bombs mal abgesehen). Was zur Hölle hast du da veranstaltet? Und warum sollte eine IDE mein Programm abbrechen nur weil sie glaubt, dass möglicherweise eine Endlosschleife vorliegt? Manchmal möchte ich sogar Endlosschleifen haben - auf meinem neuen Rechner werden die ohnehin in der Hälfte der früher benötigten Zeit fertig.
Kalli87 hat geschrieben:PPs.: Seht das bitte als spaß an ;)
Ach so. Ja dann.
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

PyCharm merkt halt wenn eine Endlosschleife da is oder irgendwas nicht ganz rund läuft und hält es an.
Ich war gerade dabei das Login weiter zu basteln und konnte mich auch einloggen und eine Fehlermeldung
ausspucken lassen wenn die Daten falsch waren. Nun wollte ich nachm login, wenn es erfolgreich war,
das er mir das eigentliche Hauptprogramm starten soll, natürlich erst mal nur ein neues Fenster anzeigen soll.
Und da saß auch der Fehler sobald ich auf Login geklickt habe ging nix mehr, das einzige was noch ging war die Maus
aber auch nur die Bewegung, kein klicken oder ähnliches, Tastatur war auch tot.

Ps.: Was ich vorhin mit dem Post sagen wollte is, nehmt es auf die leichte Schulter
BlackJack

@/me: Schleifen die nicht nur endlos laufen sondern dabei noch endlos Speicher anfordern bekommt man oft nicht beendet wenn man es nicht rechtzeitig vor dem Swappen merkt. Ob man dann bei jedem Tastendruck fünf Minuten wartet bis das System beim ganzen Swappen darauf reagiert, oder einfach darauf wartet bis der `MemoryError` den Spuk beendet, läuft da zeitlich auf's gleiche hinaus: Ein System das eine ganze Zeit lang nicht mehr benutzbar ist. :-)
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Ja sowas passiert mir natürlich gleich 4 mal :D

Ich korrigiere: 5 mal ...... :lol:
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Zum ersten darf man nichts negatives sagen - also tue ich das hier auch nicht! Das zweite macht alleine beim drüber scrollen schon einen schlechten Eindruck (kein PEP8 bei Methodennamen, ``__del__`` wird "besprochen", usw).

Man kann also durchaus auch andere Tutorials einmal in Betracht ziehen. "Learn python the hard way" wird gerne empfohlen, wobei ich nicht weiß, ob es da einen dezidierten OOP Teil gibt.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
snafu
User
Beiträge: 6861
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

/me hat geschrieben:
Kalli87 hat geschrieben:Ich hatte heute alleine 4 Endlosschleifen gehabt die nicht mehr beendet konnte. Der PC
war komplett lahm gelegt und da war nix mit Entwicklungsumgebung schnallt das und beendet es
von alleine wie sonst auch.
Ich habe noch auf jedem meiner Rechner auf allen Systemen jede Endlosschleife beenden können (von unechten Dingern wie Fork-Bombs mal abgesehen). Was zur Hölle hast du da veranstaltet?
Vielleicht hat er versehentlich eine Endlosschleife zum Anhängen von neuen Elementen an eine Liste oder zum Verketten von Strings (``s += irgendwas`` in einer Schleife mit "ungünstiger" Abbruchbedingung) erzeugt. Wenn man das einmal in Schwung bringt, ist es meist schon zu spät, ehe man gemerkt hat, was Sache ist. Da hilft dann oft nur noch ein Reboot des Rechners.

Häufig hilft es, ``for``-Schleifen anstelle von ``while``-Schleifen zu nehmen. Es kommt aber natürlich auf den Anwendungsfall an, ob das Programmieren als ``for``-Schleife sinnvoll ist. Und bekanntlich können auch ``for``-Schleifen manchmal endlos laufen.
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Hier mal ein kleiner Auszug aus dem aktuellem Stand der Technik ;)

Code: Alles auswählen

__author__ = 'Kalli87'
from gi.repository import Gtk
from gi.repository import Pango
import tkinter
import tkinter.ttk
import tkinter.messagebox
import psycopg2
from tkinter import *
from tkinter.ttk import *
import os

class Application(Frame):

    def __init__(self, master):
        Frame.__init__(self, master)
        self.grid()
        self.datenbank()
        self.layout_login()

    def datenbank(self):
        connection = psycopg2.connect("dbname=sqltest")
        self.cursor = connection.cursor()

    def layout_login(self):
        Button(text = "Login", command = self.login).grid(row=5, column=0, sticky=NSEW, pady=4)
        Button(text='Schließen', command = self.master.quit).grid(row=5, column=1, sticky=NSEW, pady=4)

        Label(text="Username", font="Helvetica 13 bold").grid(row=4, column=0, pady=5, padx=5)
        Label(text="Passwort", font="Helvetica 13 bold").grid(row=4, column=1, pady=5, padx=5)

        self.benutzername = Entry(font=10)
        self.benutzername.grid(row=3, column=0, padx=5, pady=5)

        self.passwort = Entry(font=10, show="******")
        self.passwort.grid(row=3, column=1, padx=5, pady=5)


    def login(self):
        root.protocol("WM_DELETE_WINDOW", self.master.quit)
        self.cursor.execute("SELECT * FROM mitarbeiter WHERE loginname = %s AND passwort = %s ", (self.benutzername.get(), self.passwort.get()))
        row = self.cursor.fetchone()
        self.benutzername.delete(0, END)
        self.passwort.delete(0, END)


        if row is not None:
            print("Login erfolgreich!")

            def kunde_neu():

                nb = Notebook(self.master, name='nb', width=800, height=400) # create Notebook in "master"
                nb.grid(row=6, column=2) # fill "master" but pad sides

                tab_kunde_neu = Frame(nb, name='tab-kunde-neu')
                nb.add(tab_kunde_neu, text="Kunde (neu)")

                Label(tab_kunde_neu, text="Titel", font="Helvetica 13 bold").grid(row=1, column=0)
                Label(tab_kunde_neu, text="Name", font="Helvetica 13 bold").grid(row=1, column=2)
                Label(tab_kunde_neu, text="Vorname", font="Helvetica 13 bold").grid(row=1, column=4)
                Label(tab_kunde_neu, text="Anrede", font="Helvetica 13 bold").grid(row=3, column=0)
                Label(tab_kunde_neu, text="Geburtstag", font="Helvetica 13 bold").grid(row=3, column=2)
                Label(tab_kunde_neu, text="Staatsangehörigkeit", font="Helvetica 13 bold").grid(row=3, column=4)
                Label(tab_kunde_neu, text="Steueridentifikationsnummer", font="Helvetica 13 bold").grid(row=5, column=0)
                Label(tab_kunde_neu, text="Finanzamt", font="Helvetica 13 bold").grid(row=5, column=2)
                Label(tab_kunde_neu, text="Strasse", font="Helvetica 13 bold").grid(row=7, column=0)
                Label(tab_kunde_neu, text="Hausnummer", font="Helvetica 13 bold").grid(row=7, column=2)
                Label(tab_kunde_neu, text="Postleitzahl", font="Helvetica 13 bold").grid(row=9, column=0)
                Label(tab_kunde_neu, text="Ort", font="Helvetica 13 bold").grid(row=9, column=2)
                Label(tab_kunde_neu, text="Telefon", font="Helvetica 13 bold").grid(row=11, column=0)
                Label(tab_kunde_neu, text="Telefax", font="Helvetica 13 bold").grid(row=11, column=2)

                titel = Entry(tab_kunde_neu, font=10)
                titel.grid(row=0, column=0)
                name = Entry(tab_kunde_neu, font=10)
                name.grid(row=0, column=2)
                vorname = Entry(tab_kunde_neu, font=10)
                vorname.grid(row=0, column=4)
                anrede = Entry(tab_kunde_neu, font=10)
                anrede.grid(row=2, column=0)
                geburtstag = Entry(tab_kunde_neu, font=10)
                geburtstag.grid(row=2, column=2)

                sql=("SELECT * FROM staatsangehoerigkeit")
                self.cursor.execute(sql)

                staat = StringVar(tab_kunde_neu)
                staat.set("Staatsangehörigkeit")

                laender=[]
                for dsatz in (self.cursor):
                    staatsangehoerigkeit = dsatz[0]
                    laender.append(staatsangehoerigkeit)
                dropdown = OptionMenu(tab_kunde_neu, staat, staat.get(), *laender )
                dropdown.grid(row=2, column=4, sticky=NSEW)

                steuer = Entry(tab_kunde_neu, font=10)
                steuer.grid(row=4, column=0)
                finanzamt = Entry(tab_kunde_neu, font=10)
                finanzamt.grid(row=4, column=2)
                strasse = Entry(tab_kunde_neu, font=10)
                strasse.grid(row=6, column=0)
                hausnr = Entry(tab_kunde_neu, font=10)
                hausnr.grid(row=6, column=2)
                plz = Entry(tab_kunde_neu, font=10)
                plz.grid(row=8, column=0)
                ort = Entry(tab_kunde_neu, font=10)
                ort.grid(row=8, column=2)
                telefon = Entry(tab_kunde_neu, font=10)
                telefon.grid(row=10, column=0)
                telefax = Entry(tab_kunde_neu, font=10)
                telefax.grid(row=10, column=2)

                Button(tab_kunde_neu, text='Schließen', command=self.master.quit).grid(row=5, column=5, sticky=NSEW, pady=4)
                Button(tab_kunde_neu, text='Speichern', ).grid(row=6, column=5, sticky=NSEW, pady=4)
                Button(tab_kunde_neu, text='Abbruch', ).grid(row=7, column=5, sticky=NSEW, pady=4)

            return kunde_neu()
        else:
            print("Fehler!")
            tkinter.messagebox.showwarning('Warnung', 'Passwort oder Username war falsch')

root = Tk()
root.title('WBS')
app = Application(root)
root.mainloop()
Benutzeravatar
snafu
User
Beiträge: 6861
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Typisches Beispiel von schnell hingeklatschter GUI-Programmierung: Vielleicht sieht die grafische Oberfläche einigermaßen aus, aber auf die Qualität des Codes wird offenbar kaum Rücksicht genommen. Das wird mit jeder Erweiterung unübersichtlicher und macht dadurch immer weniger Lust, sich mit dem Code zu befassen. Aber muss ja jeder selber wissen...
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

danke snafu für deine Kritik aber es verlangt ja keiner das du dich gerade damit befassen musst.
Ich wollte nur mal meinen aktuellen Stand Posten.

BlackJack, Sirus3 und /me sind bis jetzt die drei gewesen die sehr oft sich zu Wort gemeldet und
geholfen haben. Sie kennen meine Anfangsschwierigkeiten und andere kleinere Dinge wo ich mich
total dumm angestellt habe.

Wenn ich diesen Code und meinen Code den ich vorher fabriziert habe vergleiche kann ich
sagen das es schon sehr viel besser aussieht als vorher.
Benutzeravatar
snafu
User
Beiträge: 6861
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Kalli87 hat geschrieben:Wenn ich diesen Code und meinen Code den ich vorher fabriziert habe vergleiche kann ich
sagen das es schon sehr viel besser aussieht als vorher.
Also ``kunde_neu()`` sieht für mich ziemlich übel aus. Ist das dein Werk oder hat das größtenteils die IDE für dich erledigt?

Und wieso wird ``kunde_neu()`` innerhalb der Methode ``login()`` definiert? Ist dir bewusst, dass das dadurch überhaupt keine Instanzmethode ist?
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Mein Werk, meine Logik, mein Aufbau
Hab es geändert und angepasst
Benutzeravatar
snafu
User
Beiträge: 6861
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Kalli87 hat geschrieben:Mein Werk, meine Logik, mein Aufbau
Das heißt die ellenlange ``login()``-Methode, die nebenher noch ganz andere Dinge macht als ihr Name vermuten lässt, ist in dieser Form ok für dich?

EDIT: Anscheinend nicht. Inzwischen hast du ja zu deiner Antwort etwas dazueditiert.
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Code: Alles auswählen

def login(self):
        root.protocol("WM_DELETE_WINDOW", self.master.quit)
        self.cursor.execute("SELECT * FROM mitarbeiter WHERE loginname = %s AND passwort = %s ", (self.benutzername.get(), self.passwort.get()))
        row = self.cursor.fetchone()
        self.benutzername.delete(0, END)
        self.passwort.delete(0, END)


        if row is not None:
            print("Login erfolgreich!")
            return self.kunde_neu()
        
        else:
            print("Fehler!")
            tkinter.messagebox.showwarning('Warnung', 'Passwort oder Username war falsch')
so besser?
Benutzeravatar
snafu
User
Beiträge: 6861
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Kalli87 hat geschrieben:so besser?
Auf jeden Fall. Wenn du ein bißchen weiter mit deinen Python-Kenntnissen bist, dann könntest du bei einer fehlgeschlagenen Anmeldung eine Exception werfen. Außerdem ist es nicht so günstig, dass die ``login()``-Methode ihrerseits die Funktionalität zum Erfassen der Kundendaten aufruft. Man könnte - wenn man noch keine Exceptions benutzen möchte - stattdessen die ``login()``-Methode einen Wahrheitswert (also ``True`` oder ``False``) zurückliefern lassen, die anzeigt, ob der Login erfolgreich war. Dann würde der Programmcode, der ``login()`` aufruft, aufgrund dieser Rückgabe entscheiden, was als nächstes geschieht. Verstehst du, was ich meine?
Benutzeravatar
snafu
User
Beiträge: 6861
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Und hier noch ein (ungetesteter) Vorschlag, wie man das Erzeugen des Inhalts für die Eingabemaske der Kundendaten ein bißchen sauberer kodieren kann:

Code: Alles auswählen

def create_frame_new_customer(notebook, font='Helvetica 13 bold'):
    frame = Frame(notebook, name='tab-kunde-neu')
    label_data = [
        ('Titel', 1, 0),
        ('Name', 1, 2),
        # usw
    ]
    for text, row, column in label_data:
        Label(frame, text=text, font=font).grid(row=row, column=column)
    return frame
Hier wird also möglichst auf Copy&Paste verzichtet, indem die sich ändernden Angaben zunächst separat als ``label_data`` definiert werden. Anschließend wird nur noch in einer ``for``-Schleife diese Datenstruktur in eine "Label-Konstruktion" übersetzt.

In tatsächlichem Programmcode würde ich die Angabe zur Schriftart aber wohl an eine andere Stelle setzen. Das diente jetzt nur der Einfachheit halber.
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Beides hab ich soweit verstanden, aber bis ich soweit bin wird es wohl noch ein wenig Zeit brauchen.
Dein letzter Post der ging mir schon durch den Kopf weil mich das auch nervt alles extra zu schreiben
oder wie man so schön sagt "Copy & Paste".

Ich werd es im Hinterkopf behalten :wink:
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Gesundes neues Jahr wünsche ich euch :)

Gleich zu beginn hab ich eine Frage bezüglich dem Dekonstruktor.
Ich möchte eine Funktion "zerstören" welches ein Layout beinhaltet.
Konkret handelt es sich dabei um das Login-Layout welches nach erfolgreichem Login
weiterhin angezeigt wird.

Aktueller Code sieht so aus:

Code: Alles auswählen

__author__ = 'Kalli87'
from gi.repository import Gtk
from gi.repository import Pango
import tkinter
import tkinter.ttk
import tkinter.messagebox
import psycopg2
from tkinter import *
from tkinter.ttk import *
import os

class Application(Frame):

    def __init__(self, master):
        Frame.__init__(self, master)
        self.grid()
        self.datenbank()
        self.layout_login()

    def __del__(self):
        del self.layout_login
        print("Irgendwas")

    def datenbank(self):
        connection = psycopg2.connect("dbname=sqltest")
        self.cursor = connection.cursor()

    def layout_login(self):
        Button(text = "Login", command = self.login).grid(row=5, column=0, sticky=NSEW, pady=4)
        Button(text = 'Schließen', command = self.master.quit).grid(row=5, column=1, sticky=NSEW, pady=4)

        Label(text = "Username", font="Helvetica 13 bold").grid(row=4, column=0, pady=5, padx=5)
        Label(text = "Passwort", font="Helvetica 13 bold").grid(row=4, column=1, pady=5, padx=5)

        self.benutzername = Entry(font=10)
        self.benutzername.grid(row=3, column=0, padx=5, pady=5)

        self.passwort = Entry(font=10, show="******")
        self.passwort.grid(row=3, column=1, padx=5, pady=5)

    def layout_tabs(self):
        nb = Notebook(self.master, name='nb', width=800, height=400) # create Notebook in "master"
        nb.grid(row=6, column=2) # fill "master" but pad sides

        self.tab_kunde_neu = Frame(nb, name='tab-kunde-neu')
        nb.add(self.tab_kunde_neu, text="Kunde (neu)")

        self.tab_kunde = Frame(nb, name='tab-kunde')
        nb.add(self.tab_kunde, text="Kunde")

        self.tab_vermittler_neu = Frame(nb, name='tab-vermittler-neu')
        nb.add(self.tab_vermittler_neu, text="Vermittler (neu)")

        self.tab_vermittler = Frame(nb, name='tab-vermittler')
        nb.add(self.tab_vermittler, text="Vermittler")

        self.tab_test = Frame(nb, name="test_teb")
        nb.add(self.tab_test, text="tab_test")

    def kunde_neu(self):

            Label(self.tab_kunde_neu, text="Titel", font="Helvetica 13 bold").grid(row=1, column=0)
            Label(self.tab_kunde_neu, text="Name", font="Helvetica 13 bold").grid(row=1, column=2)
            Label(self.tab_kunde_neu, text="Vorname", font="Helvetica 13 bold").grid(row=1, column=4)
            Label(self.tab_kunde_neu, text="Anrede", font="Helvetica 13 bold").grid(row=3, column=0)
            Label(self.tab_kunde_neu, text="Geburtstag", font="Helvetica 13 bold").grid(row=3, column=2)
            Label(self.tab_kunde_neu, text="Staatsangehörigkeit", font="Helvetica 13 bold").grid(row=3, column=4)
            Label(self.tab_kunde_neu, text="Steueridentifikationsnummer", font="Helvetica 13 bold").grid(row=5, column=0)
            Label(self.tab_kunde_neu, text="Finanzamt", font="Helvetica 13 bold").grid(row=5, column=2)
            Label(self.tab_kunde_neu, text="Strasse", font="Helvetica 13 bold").grid(row=7, column=0)
            Label(self.tab_kunde_neu, text="Hausnummer", font="Helvetica 13 bold").grid(row=7, column=2)
            Label(self.tab_kunde_neu, text="Postleitzahl", font="Helvetica 13 bold").grid(row=9, column=0)
            Label(self.tab_kunde_neu, text="Ort", font="Helvetica 13 bold").grid(row=9, column=2)
            Label(self.tab_kunde_neu, text="Telefon", font="Helvetica 13 bold").grid(row=11, column=0)
            Label(self.tab_kunde_neu, text="Telefax", font="Helvetica 13 bold").grid(row=11, column=2)

            self.titel = Entry(self.tab_kunde_neu, font=10)
            self.titel.grid(row=0, column=0)
            self.name = Entry(self.tab_kunde_neu, font=10)
            self.name.grid(row=0, column=2)
            self.vorname = Entry(self.tab_kunde_neu, font=10)
            self.vorname.grid(row=0, column=4)
            self.anrede = Entry(self.tab_kunde_neu, font=10)
            self.anrede.grid(row=2, column=0)
            self.geburtstag = Entry(self.tab_kunde_neu, font=10)
            self.geburtstag.grid(row=2, column=2)

            sql=("SELECT * FROM staatsangehoerigkeit")
            self.cursor.execute(sql)

            staat = StringVar(self.tab_kunde_neu)
            staat.set("Staatsangehörigkeit")

            laender=[]
            for dsatz in (self.cursor):
                staatsangehoerigkeit = dsatz[0]
                laender.append(staatsangehoerigkeit)
            dropdown = OptionMenu(self.tab_kunde_neu, staat, staat.get(), *laender )
            dropdown.grid(row=2, column=4, sticky=NSEW)

            self.steuer = Entry(self.tab_kunde_neu, font=10)
            self.steuer.grid(row=4, column=0)
            self.finanzamt = Entry(self.tab_kunde_neu, font=10)
            self.finanzamt.grid(row=4, column=2)
            self.strasse = Entry(self.tab_kunde_neu, font=10)
            self.strasse.grid(row=6, column=0)
            self.hausnr = Entry(self.tab_kunde_neu, font=10)
            self.hausnr.grid(row=6, column=2)
            self.plz = Entry(self.tab_kunde_neu, font=10)
            self.plz.grid(row=8, column=0)
            self.ort = Entry(self.tab_kunde_neu, font=10)
            self.ort.grid(row=8, column=2)
            self.telefon = Entry(self.tab_kunde_neu, font=10)
            self.telefon.grid(row=10, column=0)
            self.telefax = Entry(self.tab_kunde_neu, font=10)
            self.telefax.grid(row=10, column=2)

            Button(self.tab_kunde_neu, text='Schließen', command=self.master.quit).grid(row=5, column=5, sticky=NSEW, pady=4)
            Button(self.tab_kunde_neu, text='Speichern', ).grid(row=6, column=5, sticky=NSEW, pady=4)
            Button(self.tab_kunde_neu, text='Abbruch', command=self.abbruch).grid(row=7, column=5, sticky=NSEW, pady=4)

    def kunde(self):

        Label(self.tab_kunde, text="Steueridentnr suchen", font="Helvetica 13 bold").grid(row=0, column=0)
        suche = Entry(self.tab_kunde, font=10)
        suche.grid(row=0, column=1)


        def suchen():
            suchfu=[]
            suchfu.append(suche.get())
            connection = psycopg2.connect("dbname=sqltest")
            cursor = connection.cursor()
            cursor.execute('SELECT * FROM personen WHERE steuerident = %s ', suchfu)

            ausgabetitel.delete (0, END)
            ausgabename.delete (0, END)
            ausgabevorname.delete (0, END)
            ausgabeanrede.delete (0, END)
            ausgabegeburtstag.delete (0, END)
            ausgabestaat.delete (0, END)
            ausgabesteuer.delete (0, END)
            ausgabefinanzamt.delete (0, END)
            ausgabestrasse.delete (0, END)
            ausgabehausnr.delete (0, END)
            ausgabeort.delete (0, END)
            ausgabeplz.delete (0, END)
            ausgabetelefon.delete (0, END)
            ausgabetelefax.delete (0, END)

            for dsatz in (cursor):
                titel    =   dsatz[0]
                name   =     dsatz[1]
                vorname =    dsatz[2]
                anrede =     dsatz[3]
                geburtstag = dsatz[4]
                staat =      dsatz[5]
                steuer =     dsatz[6]
                finanzamt =  dsatz[7]
                strasse =    dsatz[8]
                hausnr =     dsatz[9]
                ort =        dsatz[10]
                plz =        dsatz[11]
                telefon =    dsatz[12]
                telefax =    dsatz[13]

                ausgabetitel.insert             ("end", titel)
                ausgabename.insert              ("end", name)
                ausgabevorname.insert           ("end", vorname)
                ausgabeanrede.insert            ("end", anrede)
                ausgabegeburtstag.insert        ("end", geburtstag)
                ausgabestaat.insert             ("end", staat)
                ausgabesteuer.insert            ("end", steuer)
                ausgabefinanzamt.insert         ("end", finanzamt)
                ausgabestrasse.insert           ("end", strasse)
                ausgabehausnr.insert            ("end", hausnr)
                ausgabeort.insert               ("end", ort)
                ausgabeplz.insert               ("end", plz)
                ausgabetelefon.insert           ("end", telefon)
                ausgabetelefax.insert           ("end", telefax)

        def update():
            self.cursor.execute("UPDATE personen SET "
                           "titel=      %s, "
                           "name=       %s, "
                           "vorname=    %s, "
                           "anrede=     %s, "
                           "geburtstag= %s, "
                           "staat=      %s, "
                           "steuerident=%s, "
                           "finanzamt=  %s, "
                           "strasse=    %s, "
                           "hausnummer= %s, "
                           "ort=        %s, "
                           "plz=        %s, "
                           "telefon=    %s, "
                           "telefax=    %s"
                           "WHERE steuerident=%s",
                           (ausgabetitel.get(),
                            ausgabename.get(),
                            ausgabevorname.get(),
                            ausgabeanrede.get(),
                            ausgabegeburtstag.get(),
                            ausgabestaat.get(),
                            ausgabesteuer.get(),
                            ausgabefinanzamt.get(),
                            ausgabestrasse.get(),
                            ausgabehausnr.get(),
                            ausgabeort.get(),
                            ausgabeplz.get(),
                            ausgabetelefon.get(),
                            ausgabetelefax.get(),
                            suche.get()))

            ausgabetitel.delete (0, END)
            ausgabename.delete (0, END)
            ausgabevorname.delete (0, END)
            ausgabeanrede.delete (0, END)
            ausgabegeburtstag.delete (0, END)
            ausgabestaat.delete (0, END)
            ausgabesteuer.delete (0, END)
            ausgabefinanzamt.delete (0, END)
            ausgabestrasse.delete (0, END)
            ausgabehausnr.delete (0, END)
            ausgabeort.delete (0, END)
            ausgabeplz.delete (0, END)
            ausgabetelefon.delete (0, END)
            ausgabetelefax.delete (0, END)

        Button(self.tab_kunde, text='Suchen', command=suchen).grid(row=0, column=2, sticky=W, pady=20)
        Button(self.tab_kunde, text='Ändern', command=update).grid(row=8, column=2, sticky=W)

        #Beschriftung
        Label(self.tab_kunde, text="Titel", font="Helvetica 13 bold").grid(row=4, column=0, pady=5, padx=5)
        Label(self.tab_kunde, text="Name", font="Helvetica 13 bold").grid(row=4, column=1, pady=5, padx=5)
        Label(self.tab_kunde, text="Vorname", font="Helvetica 13 bold").grid(row=4, column=2, pady=5, padx=5)
        Label(self.tab_kunde, text="Anrede", font="Helvetica 13 bold").grid(row=6, column=0, pady=5, padx=5)
        Label(self.tab_kunde, text="Geburtstag", font="Helvetica 13 bold").grid(row=6, column=1, pady=5, padx=5)
        Label(self.tab_kunde, text="Staatsangehörigkeit", font="Helvetica 13 bold").grid(row=6, column=2, pady=5, padx=5)
        Label(self.tab_kunde, text="Steueridentifikationsnr", font="Helvetica 13 bold").grid(row=8, column=0, pady=5, padx=5)
        Label(self.tab_kunde, text="Finanzamt", font="Helvetica 13 bold").grid(row=8, column=1, pady=5, padx=5)
        Label(self.tab_kunde, text="Strasse", font="Helvetica 13 bold").grid(row=10, column=0, pady=5, padx=5)
        Label(self.tab_kunde, text="Hausnummer", font="Helvetica 13 bold").grid(row=10, column=1, pady=5, padx=5)
        Label(self.tab_kunde, text="Postleitzahl", font="Helvetica 13 bold").grid(row=12, column=0, pady=5, padx=5)
        Label(self.tab_kunde, text="Ort", font="Helvetica 13 bold").grid(row=12, column=1, pady=5, padx=5)
        Label(self.tab_kunde, text="Telefon", font="Helvetica 13 bold").grid(row=14, column=0, pady=5, padx=5)
        Label(self.tab_kunde, text="Telefax", font="Helvetica 13 bold").grid(row=14, column=1, pady=5, padx=5)

        #Eingabefelder
        ausgabetitel = Entry(self.tab_kunde, font=10)
        ausgabetitel.grid(row=3, column=0, padx=5)
        ausgabename = Entry(self.tab_kunde, font=10)
        ausgabename.grid(row=3, column=1, padx=5)
        ausgabevorname = Entry(self.tab_kunde, font=10)
        ausgabevorname.grid(row=3, column=2, padx=5)
        ausgabeanrede = Entry(self.tab_kunde, font=10)
        ausgabeanrede.grid(row=5, column=0, padx=5)
        ausgabegeburtstag = Entry(self.tab_kunde, font=10)
        ausgabegeburtstag.grid(row=5, column=1, padx=5)
        ausgabestaat = Entry(self.tab_kunde, font=10)
        ausgabestaat.grid(row=5, column=2, padx=5)
        ausgabesteuer = Entry(self.tab_kunde, font=10)
        ausgabesteuer.grid(row=7, column=0, padx=5)
        ausgabefinanzamt = Entry(self.tab_kunde, font=10)
        ausgabefinanzamt.grid(row=7, column=1, padx=5)
        ausgabestrasse = Entry(self.tab_kunde, font=10)
        ausgabestrasse.grid(row=9, column=0, padx=5)
        ausgabehausnr = Entry(self.tab_kunde, font=10)
        ausgabehausnr.grid(row=9, column=1, padx=5)
        ausgabeplz = Entry(self.tab_kunde, font=10)
        ausgabeplz.grid(row=11, column=0, padx=5)
        ausgabeort = Entry(self.tab_kunde, font=10)
        ausgabeort.grid(row=11, column=1, padx=5)
        ausgabetelefon = Entry(self.tab_kunde, font=10)
        ausgabetelefon.grid(row=13, column=0, padx=5)
        ausgabetelefax = Entry(self.tab_kunde, font=10)
        ausgabetelefax.grid(row=13, column=1, padx=5)

    def vermittler_neu(self):
        Label(self.tab_vermittler_neu, text="Titel", font="Helvetica 13 bold").grid(row=1, column=0)
        Label(self.tab_vermittler_neu, text="Name", font="Helvetica 13 bold").grid(row=1, column=2)
        Label(self.tab_vermittler_neu, text="Vorname", font="Helvetica 13 bold").grid(row=1, column=4)

        Label(self.tab_vermittler_neu, text="Anrede", font="Helvetica 13 bold").grid(row=3, column=0)
        Label(self.tab_vermittler_neu, text="Geburtstag", font="Helvetica 13 bold").grid(row=3, column=2)
        Label(self.tab_vermittler_neu, text="Staatsangehörigkeit", font="Helvetica 13 bold").grid(row=3, column=4)

        Label(self.tab_vermittler_neu, text="Steueridentifikationsnummer", font="Helvetica 13 bold").grid(row=5, column=0)
        Label(self.tab_vermittler_neu, text="Finanzamt", font="Helvetica 13 bold").grid(row=5, column=2)

        Label(self.tab_vermittler_neu, text="Strasse", font="Helvetica 13 bold").grid(row=7, column=0)
        Label(self.tab_vermittler_neu, text="Hausnummer", font="Helvetica 13 bold").grid(row=7, column=2)

        Label(self.tab_vermittler_neu, text="Postleitzahl", font="Helvetica 13 bold").grid(row=9, column=0)
        Label(self.tab_vermittler_neu, text="Ort", font="Helvetica 13 bold").grid(row=9, column=2)

        Label(self.tab_vermittler_neu, text="Telefon", font="Helvetica 13 bold").grid(row=11, column=0)
        Label(self.tab_vermittler_neu, text="Telefax", font="Helvetica 13 bold").grid(row=11, column=2)

        neu1 = Entry(self.tab_vermittler_neu, font=10)
        neu1.grid(row=0, column=0)

        neu2 = Entry(self.tab_vermittler_neu, font=10)
        neu2.grid(row=0, column=2)

        neu3 = Entry(self.tab_vermittler_neu, font=10)
        neu3.grid(row=0, column=4)

        neu4 = Entry(self.tab_vermittler_neu, font=10)
        neu4.grid(row=2, column=0)

        neu5 = Entry(self.tab_vermittler_neu, font=10)
        neu5.grid(row=2, column=2)

        neu6 = Entry(self.tab_vermittler_neu, font=10)
        neu6.grid(row=2, column=4)

        neu7 = Entry(self.tab_vermittler_neu, font=10)
        neu7.grid(row=4, column=0)

        neu8 = Entry(self.tab_vermittler_neu, font=10)
        neu8.grid(row=4, column=2)

        neu9 = Entry(self.tab_vermittler_neu, font=10)
        neu9.grid(row=6, column=0)

        neu10 = Entry(self.tab_vermittler_neu, font=10)
        neu10.grid(row=6, column=2)

        neu11 = Entry(self.tab_vermittler_neu, font=10)
        neu11.grid(row=8, column=0)

        neu12 = Entry(self.tab_vermittler_neu, font=10)
        neu12.grid(row=8, column=2)

        neu13 = Entry(self.tab_vermittler_neu, font=10)
        neu13.grid(row=10, column=0)

        neu14 = Entry(self.tab_vermittler_neu, font=10)
        neu14.grid(row=10, column=2)


        Button(self.tab_vermittler_neu, text='Schließen', command=self.master.quit).grid(row=5, column=5, sticky=NSEW, pady=4)
        Button(self.tab_vermittler_neu, text='Speichern').grid(row=6, column=5, sticky=NSEW, pady=4)
        Button(self.tab_vermittler_neu, text='Abbruch').grid(row=7, column=5, sticky=NSEW, pady=4)

    def login(self):
        root.protocol("WM_DELETE_WINDOW", self.master.quit)
        self.cursor.execute("SELECT * FROM mitarbeiter WHERE loginname = %s AND passwort = %s ", (self.benutzername.get(), self.passwort.get()))
        row = self.cursor.fetchone()
        self.benutzername.delete(0, END)
        self.passwort.delete(0, END)

        if row is not None:
            print("Login erfolgreich!")
            tkinter.messagebox.showinfo('Erfolgreich', 'Login Erfolgreich')
            return self.layout_tabs(), self.kunde_neu(), self.kunde(), self.vermittler_neu()

        else:
            print("Fehler!")
            tkinter.messagebox.showwarning('Warnung', 'Passwort oder Username war falsch')

    def abbruch(self):
            self.titel.delete(0, END)
            self.name.delete(0, END)
            self.vorname.delete(0, END)
            self.anrede.delete(0, END)
            self.geburtstag.delete(0, END)
            self.steuer.delete(0, END)
            self.finanzamt.delete(0, END)
            self.strasse.delete(0, END)
            self.hausnr.delete(0, END)
            self.plz.delete(0, END)
            self.ort.delete(0, END)
            self.telefon.delete(0, END)
            self.telefax.delete(0, END)

root = Tk()
root.title('WBS')
app = Application(root)
root.mainloop()
Dass das Layout weiterhin angezeigt wird ist für mich klar weil
es in der "__init__" aufgerufen wird. (Zeile 18)
Mein Gedanke war es über die Variante mit "__del__" zu beenden.
Was mir aber auffiel ist das viele Beispiele die ich mir angeschaut habe
nie eine komplette Funktion zerstören sondern immer nur einzelne Variablen
was für mich wenig Sinn macht.

ps. Oder sollte ich lieber das komplette Login-verfahren in eine eigene Klasse packen um
diese nach Erfolg zu zerstören?
Sirius3
User
Beiträge: 18264
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kalli87: Programmieren ist nicht wie Zaubern, wo man den bösen Zauberer umbringt und seine bösen Zaubersprüche werden wieder rückgängig gemacht. Du mußt schon jedes einzelne Label und jeden Button aus Deinem Frame wieder entfernen, oder Du packst alles gleich in einen Frame, dann reicht es, den verschwinden zu lassen. Oft macht man dafür ein eigenes Fenster, weil sich dann die Login-Logik sauberer von der eigenlichen Verarbeitungslogik trennen läßt.
Übrigens, wann glaubst Du, dass Deine __del__-Methode aufgerufen wird?
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

__del__-Methode wird gar nicht aufgerufen :)
Soviel hab ich schon verstanden und das ganze in einem Frame packen is an sich
keine dumme Idee, muss ich mal gucken wie ich das ganze umsetzen werde.

Danke Sirius3
Antworten