aktualisierten Wert in Gui ausgeben

Fragen zu Tkinter.
Antworten
Akaju
User
Beiträge: 3
Registriert: Donnerstag 25. Januar 2024, 09:08

Hallo, ich habe in anderen Programmiersprachen etwas herumgecodet, bin in Python jedoch totaler Anfänger.
Ich bekomme es nicht hin, sich ändernde Ergebnisse, die mit "print" mühelos dargestellt werden können, (z.B. römische Zahlen heraufzuzählen) in einer Gui anzuzeigen. Die Ergebnisse meiner Funktion sollen in einem Fenster an einer bestimmten Position auf dem Monitor sich verändernd dargestellt werden (wie ein Counter, nur eben mit wechselnden Strings). Gerne würde auch noch per Tastatur Einfluss auf die Geschwindigkeit des Zählens nehmen. Wie gehe ich da am besten vor?

Danke im Voraus
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Akaju: Python lernen, mindestens bis einschliesslich objektorientierter Programmierung (OOP), denn das braucht man bei jeder nicht-trivialen GUI-Anwendung.

Und dann ist der Unterschied zwischen `print()`-Ausgaben und GUIs, übrigens auch in anderen Programmiersprachen, dass Programme nicht mehr linear ablaufen, sondern dass GUIs ereignisorientiert funktionieren. Das heisst man darf keinen lang laufenden Code mehr schreiben, wie eine Schleife mit einem Countdown, weil bei einer GUI so gut wie immer *deren* Hauptschleife laufen muss, die dann bei bestimmten Ereignissen Code aufruft. Zum Beispiel wenn der Benutzer eine Schaltfläche angeklickt hat, oder eine Taste gedrückt hat, oder eine vorgegebene Zeit verstrichen ist. Dann darf Dein Code *kurz* etwas tun, und muss zur GUI-Schleife zurückkehren, die dann auch Änderungen in der GUI anzeigt.

Du wirst das herauf zählen in Schritte aufteilen müssen, wo dann jeder Schritt durch die `after()`-Methode aufgerufen wird. Bei diesem einfachen Beispiel kommt man noch um OOP herum, weil man den aktuellen Zählerwert als Argument bei jedem Aufruf durchreichen kann.

Code: Alles auswählen

#!/usr/bin/env python3
import tkinter as tk


def count_up(label, value):
    label["text"] = value
    label.after(1000, count_up, label, value + 1)


def main():
    root = tk.Tk()
    label = tk.Label(root)
    label.pack()
    count_up(label, 0)
    root.mainloop()


if __name__ == "__main__":
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Akaju
User
Beiträge: 3
Registriert: Donnerstag 25. Januar 2024, 09:08

Da ich ja keine Arabischen Zahlen hochzählen möchte, sondern Römische, scheint es so nicht zu gehen.
Ich habe eine Funktion geschrieben, die Arabische Zahlen in Römische umwandelt und dachte mir, diese Funktion im count_up aufrufen zu können., was aber nicht funktioniert. Sobald ich in der Zeile

Code: Alles auswählen

label.after(1000, count_up, label, value + 1)
etwas anderes anstelle von "value + 1" einsetze, läuft es nicht weiter nach dem ersten Durchgang.

Wie kann man denn generell einen sich verändernden return-wert einer Funktion in einer Gui ausgeben?
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Die `after`-Zeile sorgt nur dafür, dass die Funktion count_up nach einer gewissen Zeit neu aufgerufen wird, die eigentliche Funktionalität ist in der Funktion, hier also die Zeile

Code: Alles auswählen

label["text"] = number_to_roman_numeral(value)
Antworten