Wie kann ich ein Label nach einer bestimmten Zeit ändern?

Fragen zu Tkinter.
Antworten
Col.Mars
User
Beiträge: 14
Registriert: Mittwoch 7. März 2018, 10:26

Hi ich schreibe gerade ein Programm in dem das Ergebnis einer Datenbank Abfrage in 3 Variablen gespeichert und dann von 3 Labels ausgegeben wird.
Da die Abfrage einen Geld Betrag sowie vor und Nachname anzeigt, sollte dies nicht länger als wenige Sekunden zu sehen sein.

Code: Alles auswählen

        result = cursor.fetchall()
        for data in result:
            vorname = str(data[1])
            name = str(data[2])
            guthaben = float(data[3])
            L_Name.config(text=name)
            L_Vorname.config(text=vorname)
            L_Guthaben.config(text=guthaben)
        cursor.close()
        time.sleep(3)
        L_Name.config(text="")
        L_Vorname.config(text=""
        L_Guthaben.config(text="")
Leider funktioniert das so nicht :/
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Col.Mars: da GUIs ereignisbasiert arbeiten, darf eine Funktion nicht längere Zeit brauchen, verboten sind also `sleep`, Endlosschleifen, etc. Lösung ist mit `after` nach einer bestimmten Zeit eine weitere Funktion aufzurufen.

Wenn eine SQL-Abfrage exakt ein Ergebnis liefert, sollte man keine Schleife sondern `fetchone` verwenden. Statt bei Labels die text-Eigenschaft zu setzen, benutze `StringVar`. `vorname` und `name` sollten schon Strings sein, das guthaben sollte mit `format` entsprechend der Nachkommastellenanzahl formatiert werden. Den SQL-Ausdruck hast Du nicht gezeigt, dort sollte aber die Namen der Felder explizit angegeben werden. Statt `data` kann man dann gleich Tupleunpacking benutzen.
Col.Mars
User
Beiträge: 14
Registriert: Mittwoch 7. März 2018, 10:26

Wie funktioniert das mit 'format' ? Steige da irgendwie nicht ganz durch :D
Wenn ich mir jetzt ein Guthabenstand von "1.10€" anzeigen möchte wird mir "1.1€" angzeigt, wenn ich das richtig verstanden habe bewirkt 'format', dass mir dann auch wirklich "1.10€" angezeigt wird?
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist alles dokumentiert:

https://docs.python.org/3/library/strin ... t-examples

Dein Beispiel waere

'Correct answers: {:.2%}'.format(points/total)
Col.Mars
User
Beiträge: 14
Registriert: Mittwoch 7. März 2018, 10:26

'Correct answers: {:.2%}'.format(points/total)

Scheint so als würde ich dort einen Prozentwert erhalten.

Ich benötige jedoch etwas was mir statt "1.1" -> "1.10" anzeigt.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Col.Mars: Das war ja auch nur ein Beispiel, Du musst dann schon schauen was Du konkret für Deinen Fall für Formatierungsanweisungen brauchst.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Col.Mars
User
Beiträge: 14
Registriert: Mittwoch 7. März 2018, 10:26

Hab's, hier die Lösung falls jemand ein ähnliches Problem hat :D

Code: Alles auswählen

for data in result:
      guthaben = str(data[3])
      nummer = "{num:<04}".format(num=guthaben)
      label2.config(text=nummer)
cursor.close()
Für Werte wie bspw. 26.10 geht es folgendermaßen :D

Code: Alles auswählen

for data in result:
            guthaben = str(data[3])
            if len(guthaben) > 3:
                nummer = "{num:<05}".format(num=guthaben)
            else:
                nummer = "{num:<04}".format(num=guthaben)
            anweisungs_label2.config(text=nummer)
        cursor.close()
Zuletzt geändert von Col.Mars am Dienstag 4. September 2018, 00:00, insgesamt 1-mal geändert.
Col.Mars
User
Beiträge: 14
Registriert: Mittwoch 7. März 2018, 10:26

__blackjack__ hat geschrieben: Montag 3. September 2018, 23:46 @Col.Mars: Das war ja auch nur ein Beispiel, Du musst dann schon schauen was Du konkret für Deinen Fall für Formatierungsanweisungen brauchst.
Ist mir auch aufgefallen :mrgreen:, war nur ein wenig verwirrt weil's hieß "Dein Beispiel wäre" :D
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Col.Mars: so macht man das nicht.

Code: Alles auswählen

_, vorname, name, guthaben = cursor.fetchone()
guthaben = "{:.2f}".format(guthaben)
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wobei man wenn man wirklich nur den Wert und nichts zusätzliches formatieren möchte, auch die `format()`-Funktion verwenden kann:

Code: Alles auswählen

guthaben = format(guthaben, '.2f')
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich hab' mich da verguckt und das Prozentzeichen *IM* Format-Ausdruck nicht gesehen. Damit ist es natuerlich nicht das richtige Beispiel, aber es finden sich genug andere auf der Seite.
Antworten