AttributeError: 'NoneType' object has no attribute 'get'

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

Hallo Forum,

wir Ihr bereits aus der Betreffzeile entnehmen könnt handelt es sich genau um diesen Fehler.
Ich weiß selbst nicht was passiert ist da der Code funktionierte und ich Daten die ich in die Entry-Felder
eingegeben hatte auch an die Datenbank übertragen wurden.

Ich wollte nur die ersten Zeilen was die Datenbank betrifft anpassen und irgendwie muss sich ein Fehler
eingeschlichen haben und ich such mich echt dumm und dusselig. :K

Vielleicht kann mir einer von euch helfen und den Tip geben wo der Fehler auf einmal her kommt.

Danke, Kalli

Code: Alles auswählen

import psycopg2
from tkinter import *
from tkinter.ttk import *


def senden():
    connection = psycopg2.connect(database="sqltest")
    cursor = connection.cursor()

    #Tabelle erzeugen
    sql = "CREATE TABLE IF NOT EXISTS personen(" \
          "titel       TEXT, " \
          "name        TEXT, " \
          "vorname     TEXT, " \
          "anrede      TEXT, " \
          "geburtstag  TEXT, " \
          "staat       TEXT, " \
          "steuerident TEXT, " \
          "finanzamt   TEXT, " \
          "strasse     TEXT, " \
          "hausnummer  TEXT, " \
          "ort         TEXT, " \
          "plz         TEXT, " \
          "telefon     TEXT, " \
          "telefax     TEXT)"
    cursor.execute(sql)

    sql = "INSERT INTO personen VALUES('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')" % \
          (titel.get(), name.get(), vorname.get(),
          anrede.get(), geburtstag.get(), staat.get(),
          steuer.get(), finanzamt.get(), strasse.get(),
          hausnr.get(), plz.get(), ort.get(),
          telefon.get(), telefax.get())
    cursor.execute(sql)
    connection.close()

    #Inhalt der Eingabefelder nach dem senden leeren
    titel.delete(0, END)
    name.delete(0, END)
    vorname.delete(0, END)
    anrede.delete(0, END)
    geburtstag.delete(0, END)
    staat.delete(0, END)
    steuer.delete(0, END)
    finanzamt.delete(0, END)
    strasse.delete(0, END)
    hausnr.delete(0, END)
    plz.delete(0, END)
    ort.delete(0, END)
    telefon.delete(0, END)
    telefax.delete(0, END)

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


root = Tk()
root.title('WBS') # title for top-level window
master = Frame(root, name='master') # create Frame in "root"
master.pack(fill=BOTH) # fill both sides of the parent
# quit if the window is deleted
root.protocol("WM_DELETE_WINDOW", master.quit)
nb = Notebook(master, name='nb') # create Notebook in "master"
nb.grid(row=6, column=2) # fill "master" but pad sides


#Tabs hinzufügen
tab_kunde_neu = Frame(nb, name='tab-kunde-neu')
nb.add(tab_kunde_neu, text="Kunde (neu)")
tab_kunde = Frame(master, name='tab-kunde')
nb.add(tab_kunde, text="Kunde")
tab_vermittler_neu = Frame(nb, name='tab-vermittler-neu')
nb.add(tab_vermittler_neu, text="Vermittler (neu)")
tab_vermittler = Frame(nb, name='tab-vermittler')
nb.add(tab_vermittler, text="Vermittler")

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


#Eingabefelder
titel = Entry(tab_kunde_neu).grid(row=0, column=1)
name = Entry(tab_kunde_neu).grid(row=0, column=3)
vorname = Entry(tab_kunde_neu).grid(row=0, column=5)
anrede = Entry(tab_kunde_neu).grid(row=1, column=1)
geburtstag = Entry(tab_kunde_neu).grid(row=1, column=3)
staat = Entry(tab_kunde_neu).grid(row=1, column=5)
steuer = Entry(tab_kunde_neu).grid(row=2, column=1)
finanzamt = Entry(tab_kunde_neu).grid(row=2, column=3)
strasse = Entry(tab_kunde_neu).grid(row=3, column=1)
hausnr = Entry(tab_kunde_neu).grid(row=3, column=3)
plz = Entry(tab_kunde_neu).grid(row=4, column=1)
ort = Entry(tab_kunde_neu).grid(row=4, column=3)
telefon = Entry(tab_kunde_neu).grid(row=5, column=1)
telefax = Entry(tab_kunde_neu).grid(row=5, column=3)

Button(tab_kunde_neu, text='Schließen', command=master.quit).grid(row=8, column=0, sticky=W, pady=4)
Button(tab_kunde_neu, text='Speichern', command=senden).grid(row=8, column=1, sticky=W, pady=4)
Button(tab_kunde_neu, text='Abbruch', command=abbruch).grid(row=8, column=2, sticky=W, pady=4)

if __name__ == "__main__":
    master.mainloop() # call master's Frame.mainloop() method.
    root.destroy() # if mainloop quits, destroy window

Hier die Fehlerausgabe:

Code: Alles auswählen

Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib64/python3.2/tkinter/__init__.py", line 1399, in __call__
    return self.func(*args)
  File "bla bla bla", line 32, in senden
    (titel.get(), name.get(), vorname.get(),
AttributeError: 'NoneType' object has no attribute 'get'
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kalli87: es wäre gut, wenn Du den gesamten Traceback des Fehlers posten würdest, dann müßten wir nicht raten, wo der Fehler auftritt. Die grid-Methode von Entry liefert None als Rückgabewert.

*-Import sind im Allgemeinen schlecht, weil man nicht weiß, was man sich da so alles in den Namespace reinlädt, im Besonderen bei TkInter, weil das Hunderte von Namen sind. Bei den vielen Feldern wäre es praktisch, wenn Du sie alle in ein Dictionary schreibst, dann lassen sich einige Stellen im Code eleganter schreiben, ohne Copy-Paste-Orgien.
Werte sollte man nicht in SQL-Statements hineinformatieren, vor allem nicht so wie Du, ohne jegliche Sonderzeichenbehandlung. Dafür kennt psycopg2 Platzhalter.
Aller Code auf Modulebene sollte in Funktionen verschoben werden, z.B. eine main-Funktion die dann am Ende per

Code: Alles auswählen

if __name__ == "__main__":
    main()
aufgerufen wird.
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Ich bin noch recht neu was Python betrifft.
Was meinst du mit gesamten Traceback? Den Fehlercode den ich zusätzlich gepostet habe ist alles was ich bekomme
(Arbeite mit PyCharm als Entwicklungsumgebung)

Gruß Kalli
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kalli87: genau das ist der Traceback. Hab's jetzt erst gesehen, dass Du Dein Posting erweitert hast.
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Hab den Fehler gefunden :wink:
warum auch immer aber es lag aber es lag an den Eingabefeldern

Code: Alles auswählen

titel = Entry(tab_kunde).grid(row=1, column=1)
und hab es in gändert

Code: Alles auswählen

titel = Entry(tab_kunde_neu)
titel.grid(row=1, column=1)
also in zwei Zeilen geschrieben und jetzt geht es wieder.

Kann mir einer erklären woran das liegt?

Gruß Kalli
BlackJack

@Kalli87: Das hat Sirius3 doch schon geschrieben: `grid()` hat `None` als Rückgabewert und nicht das Objekt auf dem es aufgerufen wird.
Antworten