schleife beenden

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

Hallo liebes Forum.

Beim start meiner Anwendung soll sich eine Treeview mit Werten aus einer Mysql Datenbank füllen.

Das mach ich so:

Code: Alles auswählen

for i, (id,vorname,nachname,adresse,ort,mail,telefon,geburtstag,funktion,eintritt,mitgliedsbeitrag,einschreibgebuehr) in enumerate(records, start=1):
 list1.insert("", "end", values=(id,vorname,nachname,adresse,ort,mail,telefon,geburtstag,funktion,eintritt,mitgliedsbeitrag,einschreibgebuehr))
jetzt soll die Schleife enden sobald alle Elemente geladen sind. Das dürfte mit dem Befehl "break"funktionieren.

Das Problem, er stoppt schon nach dem Eintrag der 1. Zeile.

Wie kann ich also die letzte Zeile der MySql Tabelle ermitteln um den Break Pont richtig setzen zu können!

Auch an dieser Stelle möchte ich mich für (für euch) blöde Frage entschuldigen.

Ich tu mir beim lernen leichter, wenn ich Codeschnipsel habe, learning by doing. Kann mir dann eher die Hintergründe vorstellen.
Natürlich durchforste ich auch so manche tutorials um die Grundfeste zu erlangen!

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

Die Schleife endet automatisch, wenn alle Elemente durchgelaufen sind, dafür ist ja die for-Schleife da.
Wenn das nicht der Fall ist, brauchen wir mehr Informationen. Wie sieht Dein Code aus? Was passiert? Woran merkst Du, dass die Schleife nicht endet?
vierkant
User
Beiträge: 14
Registriert: Sonntag 3. April 2022, 10:24

es wird vermutlich daran liegen das ich den Code zwischen

Code: Alles auswählen

import tkinter as tk 
und

Code: Alles auswählen

root.mainloop()
geschrieben habe, der Hintergrund dieser Aktion ist, das die Treeview beim start meiner Anwendung gefüllt wird!

Bemerkt habe ich es insofern, weil plötzlich das füllen der Datenbank nicht mehr funktioniert

Code: Alles auswählen

Exception in Tkinter callback
Exception in Tkinter callback
Traceback (most recent call last):
  File "/Users/unterweger/.conda/envs/datenbank/lib/python3.10/tkinter/__init__.py", line 1921, in __call__
    return self.func(*args)
  File "/Users/unterweger/PycharmProjects/datenbank/main.py", line 82, in mtg_eintrag
    val = ("1", vorname.get(), nachname.get(), adresse.get(), ort.get(), mail.get(), tel.get(), geburtstag.get(), funktion.get(), eintritt.get(), beitrag.get(), egeb.get())
AttributeError: 'str' object has no attribute 'get'

lösche ich denn Code und lasse ich die Treeview per Button füllen funktioniert alles
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@vierkant: Eingerückt wird in Python per Konvention vier Leerzeichen pro Ebene.

Das `i` wird nirgends verwendet, also kann man sich `enumerate()` und das `i` sparen.

Die ganzen Werte aus einem Datensatz werden an einzelne Namen gebunden, nur um aus denen das in genau der gleichen Reihenfolge ein Tupel zu erstellen. Da könnte man auch gleich die jeweilige Sequenz aus `records` an *einen* Namen binden.

Man nummeriert keine Namen. Entweder will man da bessere Namen verwenden, oder gar keine Einzelnamen sondern die Werte in einer Datenstruktur speichern. Oft eine Liste. Im Fall von `list1` aber wohl ein besserer Name, denn den Leser interessiert ja nicht, dass das die erste Liste ist, für die der Autor einen Namen gesucht hat, sondern was die Werte bedeuten die da eingefügt werden.

Das `tkinter`-Modul definiert für Zeichenkettenwerte die bei bestimmten Argumenten eine besondere Bedeutung haben, Konstanten. Die sollte man benutzen, statt den literalen Zeichenkettenwert selbst noch mal hin zu schreiben.

Die Schleife könnte dann so aussehen:

Code: Alles auswählen

    for record in records:
        record_treeview.insert("", tk.END, values=record)
Die Ausnahme aus Deinem letzten Beitrag würde damit eventuell auch verschwinden, denn Du verwendest da ja anscheinend die Namen in der Schleife für Werte, die vorher mal an Eingabefelder gebunden waren. *Die* haben eine `get()`-Methode. Aber wenn Du dann etwas anderes, zum Beispiel eine Zeichenkette an den selben Namen bindest, steht der halt für die Zeichenkette und nicht mehr für das Eingabefeld. An *einen* Namen kann auch immer nur *ein* Wert zu einem gegebenen Zeitpunkt gebunden sein. Wie sollte das auch anders funktionieren?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
vierkant
User
Beiträge: 14
Registriert: Sonntag 3. April 2022, 10:24

Super, dank dir ganz herzlich 🤗
Lg Jürgen
Antworten