Seite 1 von 1

aktualisierten Wert in Gui ausgeben

Verfasst: Donnerstag 25. Januar 2024, 09:38
von Akaju
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

Re: aktualisierten Wert in Gui ausgeben

Verfasst: Donnerstag 25. Januar 2024, 10:14
von __blackjack__
@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()

Re: aktualisierten Wert in Gui ausgeben

Verfasst: Donnerstag 25. Januar 2024, 15:13
von Akaju
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?

Re: aktualisierten Wert in Gui ausgeben

Verfasst: Donnerstag 25. Januar 2024, 16:05
von Sirius3
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)