Error bei meinem Code

Fragen zu Tkinter.
Antworten
Benutzeravatar
MaximalMax
User
Beiträge: 18
Registriert: Sonntag 3. Mai 2020, 00:51

Hallo liebe Community,

Ich schreibe derzeit ein TODO-Programm und bekomme einen Error. Wieso ist das so? Existiert die Funktion get() nicht mehr, oder was ist hier jetzt falsch? Ich würde das Programm heute noch gern auf GitHub hochladen, deswegen wäre schnelle Hilfe sehr cool! Danke im Vorraus.

Code: Alles auswählen

from tkinter import *
import sqlite3 as sqlite
import os
import time

conn = sqlite.connect('database.db')
curs = conn.cursor()

if os.path.exists('database.db') == True:
    main = Tk()
    main.title("Neuer Punkt")
    main.geometry("400x500")

    heading = Label(main, text="Neuer Punkt", font=('sans-serif', 15)).pack()
    placeholder = Label(main, text="").pack()

    enter_value = Entry(main).pack()

    def save():
        data = enter_value.get("1.0",END)
        sql = "INSERT INTO todo VALUES ({})".format(data)
        curs.execute(sql)
        conn.commit()

    enter_btn = Button(main, text="Eingabe", command=save).pack()

    conn.close()
    main.mainloop()
else:
    print("Bitte führe erst die Datei 'setup.py' aus")
    conn.close()
    time.sleep(2)
    pass

Code: Alles auswählen

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\maxpr\AppData\Local\Programs\Python\Python38-32\lib\tkinter\__init__.py", line 1883, in __call__
    return self.func(*args)
  File "new.py", line 21, in save
    data = enter_value.get("1.0",END)
AttributeError: 'NoneType' object has no attribute 'get'
PS: Der Link zum Repo, wenn ihr euch das fertige Programm ansehen wollte, wenn ich es hochgeladen habe: https://github.com/Advanced-Coding/TodoTkinter
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Zuerst: niemals nie Werte in SQL- Statements hineinformatieren. Dafür gibt es Platzhalter.

Erstenmal die grundsätzlichen Sachen: keine *-Importe. tkinter wird per `import tkinter as tk` importiert. Kein Code auf oberster Ebene. Das fehlt eine main-Funktion. Keine Funktionsdefinitionen innerhalb von if oder sonstwie verschachtelt. Explizit auf True muss man nicht prüfen. Benutze keine Abkürzungen. btn? Conn?
Dann inhaltlich: mit connect wird immer eine Datei angelegt. Die Abfrage, ob die Datei existiert, ist also sinnlos. Ein setup.py auszuführen, um im lokalen Arbeitsverzeichnis eine Datenbankdatei anzulegen, ist seltsam. Da würde man dem Programm selbst eine Option mitgeben. Eine Datenbank mit ToDos datenbank db zu nennen, ist schlecht. Das kollidiert dann mit dem Programm, das Don'tDos speichert.
Cursor sind etwas kurzlebiges. Die erzeugt man pro Transaktion und nicht einmal für das ganze Programm. Man muss nicht alles an Variablen binden, vor allem nicht Rückgabewerte von Methoden, die keine haben: heading, placeholder, enter_btn. enter_value sollte wohl das Entryfeld sein.
Die conn wird schon geschlossen, bevor du überhaupt etwas eingeben kannst.
Es nervt, wenn ein Programm nach der Ausgabe 2 Sekunden wartet. Bei GUIs würde man eine Messagebox erwarten. Das pass ist überflüssig.
Antworten