Werte von Entrys in mySQL Tabelle speichern

Fragen zu Tkinter.
Antworten
vierkant
User
Beiträge: 14
Registriert: Sonntag 3. April 2022, 10:24

Hallo, grüss euch!

Ich bin absoluter Anfänger in Python. Bin gerade dabei mich reinzu arbeiten.

Nun stehe ich vor folgendem Problem:

Ich verbinde mich mit meiner mySQL Datenbank, dies funktioniert auch, des weiteren kann ich auch Werte in die Tabelle schreiben lassen.

Nun will ich das ganze über Tkinter realisieren.
Dazu hab ich mal ein paar Entry's und 1 Button erstellt

leider omm ich hier auf keine Lösung. Bei folgenden Code passiert gar nix! Auch kein Fehler

Code: Alles auswählen

import tkinter as tk  # Funktion zur Gui Möglichkeit starten
from tkinter import ttk
from PIL import Image, ImageTk   # braucht man zum Bild einfügen, vorher noch Einstellungen - Projekt - Python Interpreter - nach Pillow suchen und installieren
from tkinter import messagebox # Messagebox Funktion importieren
import mysql.connector
my_db = mysql.connector.connect(
    host="xxx",
    user="xxx",
    password="xxx",
    database="xxx")
my_cursor = my_db.cursor()




# Fenster erstellen
root = tk.Tk()  # Variable erzeugen (root =) und Fenster erzeugen
root.title("Startseite") # Fenstername definieren
root.geometry("800x1000")  # Größe des Fensters definieren (Breite x Höhe in px
root.minsize(width=250, height=250)  # Mindestgröße des Fensters definieren (Breite x Höhe)

vorname = ttk.Entry(root)  # Button erzeugen, mit "root" das zugehörige Fenster definieren. bg = Hintergrundfarbe  II  fg = Textfarbe  II command=quit -> Fenster schliessen
vorname.pack()
nachname = ttk.Entry(root)
nachname.pack()
adresse = ttk.Entry(root)
adresse.pack()
ort = ttk.Entry(root)
ort.pack()
tel = ttk.Entry(root)
tel.pack()
mail = ttk.Entry(root)
mail.pack()
geburtstag= ttk.Entry(root)
geburtstag.pack()
funktion = ttk.Entry(root)
funktion.pack()
eintritt = ttk.Entry(root)
eintritt.pack()
beitrag = ttk.Entry(root)
beitrag.pack()
egeb = ttk.Entry(root)
egeb.pack()




def mtg_eintrag():


    sql = "INSERT INTO mitglieder (id,vorname,nachname,adresse,plz/ort,e-mail,telefon,geburtstag,eintritt,mitgliedsbeitrag,einschreibgebuehr) VALUES (%s, %s, %s, %s)"
    val= ("1", vorname.get(), nachname.get(), adresse.get(), ort.get(), tel.get(), mail.get(), geburtstag.get(), funktion.get(), eintritt.get(), beitrag.get(), egeb.get())
    my_cursor.execute(sql, val)
    my_db.commit()


button1 = ttk.Button(root, text="Daten speichern", command= "mtg_eintrag")
button1.pack()


root.mainloop()  # Funktion zur GUI Möglichkeit beenden


Würde mich sehr über Hilfe freuen!!

lg Jürgen Jürgen
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

Benutze keine Abkürzungen. Was soll ein mtg sein? Oder ein egeb?
`command` bei Button erwartet eine Funktion, keinen String.
Die id bei einem Datenbankeintrag ist meist eine Zahl, und wird von der Datenbank idealerweise selbst vergeben. Dort immer den String "1" einzutragen, macht eine ID nutzlos.
Beim INSERT hast Du 11 Felder aber nur 4 Platzhalter. Manche Feldnamen haben ungültige Zeichen. Die Reihenfolge der Felder ist auch unterschiedlich zu der Reihenfolger der Values.
Cursor sind etwas kurzlebiges, das sollte man nicht einmal am Anfang erzeugen, sondern für jede Transaktion.

Globale Variablen darf man nicht benutzen. Alles was eine Funktion braucht muß sie über ihre Argumente bekommen. Bei so vielen Argumenten wird das schnell unübersichtlich, wie Du ja selbst schon bei Deinem INSERT-Aufruf merkst. Für GUIs läuft das zwangsläufig auf Klassen hinaus.
Bevor man also mit GUIs anfängt, sollte man diese Techniken schon gut beherrschen.
Benutzeravatar
__blackjack__
User
Beiträge: 13071
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ergänzend: Das mit der Fenstergrösse ist Quatsch. Die ergibt sich automatisch aus dem Fensterinhalt. Und eine minimale Grösse macht wenn überhaupt auch nur Sinn, wenn das Fenster Elemente enthält, die sich in der Grösse anpassen wenn der Benutzer die Fenstergrösse kleiner zieht.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
Dennis89
User
Beiträge: 1153
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

auch ergänzend:
Wenn ich das richtig sehe, dann schließt du deine mysql-Verbindung auch nicht. Das könnte zu (timeout-)Problemen führen. Grundsätzlich sollte man eine Datei oder eine Verbindung nach dere Verwendung auch wieder schließen. Dafür gibt es das 'with'-Statement, dass sorgt automatisch dafür, dass das geöfnete Objekt wider geschlossen wird. Im Fall von 'mysql' muss man allerdings mit 'contexlib' nachhelfen, das 'with' verwendet werden kann. Mit diesen zwei Suchbegriffen solltest du allerdings ein paar Beispiele finden.

Grüße
"When I got the music, I got a place to go" [Rancid, 1993]
vierkant
User
Beiträge: 14
Registriert: Sonntag 3. April 2022, 10:24

vielen Dank für die Hilfe.
Hab das ganze jetzt überarbeitet und auch hinbekommen!
Das einzige was mich noch fuxt ist das mit der ID, das hab ich mir irgendwie einfacher vorgestellt.

Hab mir das beim eintragen der Daten in die mySQL Tabelle so vorgestellt:

Code: Alles auswählen

id = my_cursor.lastrowid
    sql = "INSERT INTO mitglieder (id,vorname,nachname,adresse,ort,mail,telefon,geburtstag,funktion,eintritt,mitgliedsbeitrag,einschreibgebuehr) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"
    val= (id.get(+1), vorname.get(), nachname.get(), adresse.get(), ort.get(), mail.get(), tel.get(), geburtstag.get(), funktion.get(), eintritt.get(), beitrag.get(), egeb.get())
    my_cursor.execute(sql, val)
    my_db.commit()
also, meine "lächerliche vorstellung:
mit

Code: Alles auswählen

id = my_cursor.lastrowid
ermittle ich den Index letzte Zeile

Code: Alles auswählen

val= (id.get(+1)
und dann einfch diesen Wert + 1 in die Datenbank eintragen.


Was soll ich sagen, funktioniert natürlich nicht
lg Jürgen Jürgen
__deets__
User
Beiträge: 14523
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das macht man umgekehrt. Zuerst fuegt man ein, und holt sich dann die ID. ZB hier https://stackoverflow.com/questions/254 ... ith-python beschrieben.
vierkant
User
Beiträge: 14
Registriert: Sonntag 3. April 2022, 10:24

Dank dir...
Aber ich versteh es nicht 😬😬
Benutzeravatar
Dennis89
User
Beiträge: 1153
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

was genau klappt/verstehst du nicht?

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

Die ID ist etwas, was die Datenbank idealerweise selbst vergibt, das macht man nicht händisch.

Code: Alles auswählen

from contextlib import closing

def mitglied_anlegen(database, vorname, nachname):
    with closing(database.cursor()) as cursor:
        cursor.execute("INSERT INTO mitglieder (vorname, nachname) VALUES (%s, %s)",
            [vorname.get(), nachname.get()])
        rowid = cursor.lastrowid
    database.commit()
    return rowid
Antworten