@Onomatopoesie: Noch ein paar Anmerkungen zum Quelltext:
Der Coding-Kommentar ist bei Python 3 überflüssig, weil UTF-8 dort die Vorannahme von Python ist.
Sternchen-Importe sind Böse™. Damit holt man sich bei `tkinter` deutlich mehr als 100 Namen ins Modul von denen nur ein Bruchteil tatsächlich benötigt wird. Und auch Namen die gar nicht in `tkinter` definiert sind, sondern von `tkinter` selbst aus anderen Modulen importiert werden. Üblich ist es das Modul unter dem Namen `tk` zu importieren und dann darüber auf die Werte darin zuzugreifen.
Auf Modulebene gehört nur Code der Konstanten, Funktionen, und Klassen definiert. Das unübersichtlichste was man machen kann ist Hauptprogramm und Funktionsdefinitionen auf Modulebene mischen. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.
Funktionen und Methoden verwenden ausser Konstanten nichts was sie nicht als Argument(e) übergeben bekommen. Das bedeutet das man bei fast jeder nicht-trivialen GUI objektproentierte Programmierung (OOP) braucht!
Um binäre Operatoren, Zuweisungszeichen ausserhalb von Argumentlisten und nach Kommas erhöhen Leerzeichen die Lesbarkeit.
Cursor-Objekte sind etwas kurzlebiges, die hebt man nicht für die gesamte Laufzeit eines Programms auf, sondern erzeugt sie dann wenn man sie braucht und räumt sie danach auch sauber wieder ab (`close()`).
Das saubere Abräumen von Objekten die selbst keine Kontextmanager sind, aber eine `close()`-Methode haben, kann man mit ``with`` und `contextlib.closing()` sicherstellen.
Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase). Also `on_return()` statt `onReturn()`.
Für Zeichenketten mit einer festen Bedeutung für Tk hat `tkinter` Konstanten definiert.
Ganz wichtig: Keine Werte in SQL-Anfragen mit Zeichenkettenoperationen formatieren. Schon überhaupt gar nicht wenn diese Werte vom Benutzer kommen! Das ist gefährlich! In die SQL-Anfrage gehören für variable Werte Platzhalter und die Werte selbst werden als zweites Argument an `execute()` übergeben.
Bei SELECT-Anfragen sollte man die Ergebnisspalten explizit angeben um unabhängig von Anzahl und Reihenfolge der Spalten in der Datenbank zu bleiben. Zudem weiss der Leser des Quelltextes dann auch was da abgefragt wird.
Tabellennamen vergebe ich immer in der Einzahl, weil eine Tabellendefinition beschreibt wie *ein* Datensatz aussieht. Das wird noch deutlicher wenn man mal ein ORM verwendet, denn dann wird in der Regel ja eine Tabelle auf eine Klasse abgebildet.
Ungetestet:
Code: Alles auswählen
#!/usr/bin/env python3
from contextlib import closing
from functools import partial
from pathlib import Path
import sqlite3
import tkinter as tk
from tkinter import messagebox
MODULE_PATH = Path(__file__).parent
ARTICLE_DB_FILENAME = "artikel.db"
def on_return(connection, text_entry, _event):
article_number = text_entry.get()
text_entry.delete(0, tk.END)
with closing(connection.cursor()) as cursor:
#
# TODO Change * to explicit column names.
#
cursor.execute(
"SELECT * FROM artikelliste WHERE artikelnr=?", [article_number]
)
result = cursor.fetchone()
messagebox.showinfo("DB Abfrage", str(result))
def main():
root = tk.Tk()
root.geometry("480x320")
# root.attributes("-fullscreen", True)
with sqlite3.connect(MODULE_PATH / ARTICLE_DB_FILENAME) as connection:
text_entry = tk.Entry(root, width=12)
text_entry.focus_set()
root.bind("<Return>", partial(on_return, connection, text_entry))
text_entry.pack()
root.mainloop()
if __name__ == "__main__":
main()