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

Mittwoch 7. März 2018, 10:35

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: 8572
Registriert: Sonntag 21. Oktober 2012, 17:20

Mittwoch 7. März 2018, 11:02

@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

Montag 3. September 2018, 17:13

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: 3654
Registriert: Mittwoch 14. Oktober 2015, 14:29

Montag 3. September 2018, 17:21

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

Montag 3. September 2018, 23:11

'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: 1401
Registriert: Samstag 2. Juni 2018, 10:21

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.

Code: Alles auswählen

    **** COMMODORE 64 BASIC V2 ****
 64K RAM SYSTEM  38911 BASIC BYTES FREE
   CYBERPUNX RETRO REPLAY 64KB - 3.8P
READY.
█
Col.Mars
User
Beiträge: 14
Registriert: Mittwoch 7. März 2018, 10:26

Montag 3. September 2018, 23:48

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

Montag 3. September 2018, 23:50

__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: 8572
Registriert: Sonntag 21. Oktober 2012, 17:20

Dienstag 4. September 2018, 07:48

@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: 1401
Registriert: Samstag 2. Juni 2018, 10:21

Dienstag 4. September 2018, 08:17

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')

Code: Alles auswählen

    **** COMMODORE 64 BASIC V2 ****
 64K RAM SYSTEM  38911 BASIC BYTES FREE
   CYBERPUNX RETRO REPLAY 64KB - 3.8P
READY.
█
__deets__
User
Beiträge: 3654
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dienstag 4. September 2018, 10:20

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