basic-Programm nach Python

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
gerdk
User
Beiträge: 7
Registriert: Freitag 17. Februar 2023, 19:52

Hallo, bin absoluter python-Anfänger!

ich hatte vor Jahren ein Programm erstellt, welches mir Zins+Zinseszinsen berechnete.
Das "Besondere" daran war, daß

1. die komplette Tabelle immer "fest" auf dem Bildschirm zu sehen war,
2. ich durch die Taste "k" das Kapital erhöhen konnte
3. ich durch die Tasten "+" und "-" den Zinssatz um jeweils 0,25 % verändern konnte.

Leider finde ich bei python nicht, wie ich immer an die gleiche Position ausgeben kann.
Wenn jmd Tips hat, danke im voraus

hier das Basic-listing:
0 KEY OFF
20 LOCATE 25,1:PRINT SPACE$(80);
30 CLS
40 LAUF=1
50 PRINT:PRINT " Zinseszinsberechnung fÅr 20 Jahre"
60 PRINT:INPUT " Kapital : ";EINGABE
70 PRINT:INPUT " Zinssatz : ";ZINS
80 CLS
90 LOCATE 2,7:COLOR 0,7:PRINT " Zinseszinsen ";:COLOR 7,0
100 LOCATE 24,1:PRINT STRING$(80,"Õ");
110 LOCATE 25,7:COLOR 0,7
120 PRINT "+/-";
130 COLOR 7,0
140 PRINT " Zinssatz um 0.25% verÑndern",
150 COLOR 0,7
160 PRINT "K";
170 COLOR 7,0
180 PRINT "apital verÑndern ";
190 COLOR 0,7
200 PRINT "E";
210 COLOR 7,0
220 PRINT "nde";
230 LOCATE 4,7
240 PRINT "Kapital :" EINGABE;
250 LOCATE 2,30
260 PRINT "Jahr Kapital Zinsen Endkapital Zinseszinsen";
270 WHILE A$<>"e"
280 LOCATE 6,7
290 PRINT "Zinssatz :" ZINS "% ";
300 KAPITAL = EINGABE
310 WHILE LAUF <=20
320 SUM = KAPITAL * ZINS / 100
330 ZINSESZINS = ZINSESZINS + SUM
340 KAPITALNEU = KAPITAL + SUM
350 LOCATE LAUF+3,30
360 PRINT USING "##";LAUF,
370 PRINT USING " ######.##";KAPITAL,
380 PRINT USING " #####.##";SUM,
390 PRINT USING " ######.##";KAPITALNEU,
400 PRINT USING " ######.##";ZINSESZINS
410 KAPITAL=KAPITALNEU
420 LAUF=LAUF+1
430 WEND
440 LAUF=1
450 A$=INKEY$:IF A$="" THEN 450
460 IF A$="-" THEN ZINS=ZINS-.25
470 IF A$="+" THEN ZINS=ZINS+.25
480 IF A$="k" THEN LOCATE 4,18:PRINT SPACE$(10):LOCATE 4,18:INPUT "", EINGABE
490 ZINSESZINS = 0
500 WEND
510 END
Benutzeravatar
noisefloor
User
Beiträge: 3853
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

`print` gibt in Python einfach fortlaufen aus, d.h. damit kannst du nicht angeben "gebe den Text in Zeile X beginnend in Spalte Y aus". Wenn du dir ein TUI (text user inface) bauen willst gibt es dafür z.B. das `curses` Modul, was Python standardmäßig an Bord hat. Tutorial: https://docs.python.org/3/howto/curses.html

Gruß, noisefloor
Benutzeravatar
sparrow
User
Beiträge: 4185
Registriert: Freitag 17. April 2009, 10:28

Wobei mein letzter Stand ist, dass "curses" unter Windows eben nicht an Bord ist und über pip "windows-curses" nachinstalliert werden muss.
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

War da nicht urwird das Mittel der Wahl?

Aber es geht auch ein bisschen weniger schwergewichtig: https://pypi.org/project/colorama/

Damit kann man von Hand den Cursor positionieren, und auch die Farben setzen. Ich vermute, dass ist dem TE lieber. Weniger Abstraktion.
gerdk
User
Beiträge: 7
Registriert: Freitag 17. Februar 2023, 19:52

Hallo,
vielen Dank für die Antworten.
Ich vergaß zu erwähnen, daß ich an einem Mac sitze,
import cures funktioniert dort nicht (angeblich implementiert ...)
Wäre da nicht tkinter eine gute Idee, das Programm zu portieren?
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ob das eine gute Idee ist, musst du ja wissen. Es wird sehr anders werden mit tkinter, weil GUIs eine komplett andere Art zu programmieren vorraussetzen. Aber wenn du dich dieser Herausforderung stellen willst, ist das natuerlich moeglich.

Eigentlich sollte curses dabei sein. Du schreibst "cures". Das existiert nicht. Kann natuerlich nur hier ein Fehler sein, aber die genau Schreibweise ist wichtig.
Benutzeravatar
noisefloor
User
Beiträge: 3853
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

wenn du Tkinter nutzen möchtest, dann ist das eine gute Gelegenheit, tiefer bei Python in Objektorientierung, Klassen und deren Instanzen abzutauchen. Weil alles außer eine mega-trivialnen GUI solltest du in eine Klasse packen.

Gruß, noisefloor
Benutzeravatar
__blackjack__
User
Beiträge: 13069
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@gerdk: Die wahrscheinlich einfachste Art das Programm mit Python zum laufen zu bekommen ist PC-BASIC: http://robhagemans.github.io/pcbasic/

Das ist ein in Python geschriebener GW-BASIC-Interpreter. 😎
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
__blackjack__
User
Beiträge: 13069
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Anmerkungen zu dem BASIC Quelltext:

Es wurde ein Quelltext in einer DOS-Kodierung (CP437) als Text für den Mac dekodiert, weshalb die Umlaute falsch dargestellt sind, und die Trennlinie, die eigentlich aus "═"-Zeichen besteht.

Die Platzierung der Ein- und Ausgaben ist fast überall ein bisschen falsch. Wie man an folgendem ”Bildschirmfoto” sehen kann:

Code: Alles auswählen

       Zinseszinsen          Jahr Kapital Zinsen Endkapital Zinseszinsen

      Kapital : 15000         1   5000.00   150.00   5150.00    150.00
                              2   5150.00   154.50   5304.50    304.50
      Zinssatz : 3 %  %       3   5304.50   159.13   5463.64    463.64
                              4   5463.64   163.91   5627.54    627.54
                              5   5627.54   168.83   5796.37    796.37
                              6   5796.37   173.89   5970.26    970.26
                              7   5970.26   179.11   6149.37   1149.37
                              8   6149.37   184.48   6333.85   1333.85
                              9   6333.85   190.02   6523.87   1523.87
                             10   6523.87   195.72   6719.58   1719.58
                             11   6719.58   201.59   6921.17   1921.17
                             12   6921.17   207.64   7128.80   2128.80
                             13   7128.80   213.86   7342.67   2342.67
                             14   7342.67   220.28   7562.95   2562.95
                             15   7562.95   226.89   7789.84   2789.84
                             16   7789.84   233.70   8023.53   3023.53
                             17   8023.53   240.71   8264.24   3264.24
                             18   8264.24   247.93   8512.17   3512.17
                             19   8512.17   255.36   8767.53   3767.53
                             20   8767.53   263.03   9030.56   4030.56
════════════════════════════════════════════════════════════════════════════════
      +/- Zinssatz um 0.25% verändern     Kapital verändern Ende
Die Werte in der Tabelle stehen nicht ganz passend unter den Überschriften. Beim erneuten eingeben des Kapitals erfolgt die Eingabe ein Zeichen zu spät. Darum ist da noch eine 1 vor der 5000 von der initialen Eingabe des Kapitals. Beim Zinssatz werden nach dem Prozentzeichen nicht immer genügend Zeichen danach überschrieben, so dass es in bestimmten Fällen vorkommen kann, das ein weiteres "%"-Zeichen auf dem Bildschirm stehen bleibt.

Bei der Ersteingabe von Kapital und Zinssatz steht ein Semikolon beim INPUT wo eigentlich ein Komma stehen sollte, damit kein Fragezeichen nach der Eingabeaufforderung ausgegeben wird. Bei der erneuten Eingabe eines Kapitalwertes wird das ja schon so gemacht.

LAUF wird viel zu früh mit 1 initialisiert. So etwas macht man direkt vor der Schleife wo das verwendet wird, dann muss man das auch nicht *nach* der Schleife *noch mal* auf 1 setzen. Genau Ebenfalls einmal vor der Schleife sollte man ZINSESZINS intitialisieren.

LAUF sollte aber auch gar nicht eigens auf 1 gesetzt werden, denn die innere WHILE-Schleife ist eigentlich eine FOR-Schleife.

`SUM` ist gar keine Summe. Das ist der ZINS. Und was im Programm ZINS heisst, ist der ZINSSATZ.

Das END am Ende kann man sich sparen, da ist das Programm ja auch so am Ende angekommen.

Überarbeitete Version:

Code: Alles auswählen

10 KEY OFF:LOCATE 25,1:PRINT SPACE$(80);:CLS
20 PRINT:PRINT " Zinseszinsberechnung für 20 Jahre"
30 PRINT:INPUT " Kapital : ",EINGABE
40 PRINT:INPUT " Zinssatz : ",ZINSSATZ
50 CLS:LOCATE 2,7:COLOR 0,7:PRINT " Zinseszinsen ":COLOR 7,0
60 LOCATE 24,1:PRINT STRING$(80,"═");
70 LOCATE 25,7
80 COLOR 0,7:PRINT "+/-";:COLOR 7,0:PRINT " Zinssatz um 0.25% verändern",
90 COLOR 0,7:PRINT "K";:COLOR 7,0:PRINT "apital verändern ";
100 COLOR 0,7:PRINT "E";:COLOR 7,0:PRINT "nde";
110 LOCATE 4,7
120 PRINT "Kapital :";EINGABE;
130 LOCATE 2,30
140 PRINT "Jahr   Kapital   Zinsen Endkapital Zinseszinsen";
150 WHILE A$<>"e"
160 LOCATE 6,7:PRINT "Zinssatz :";ZINSSATZ;"%   ";
170 KAPITAL=EINGABE:ZINSESZINS=0
180 FOR LAUF=1 TO 20
190 ZINS=KAPITAL*ZINSSATZ/100
200 ZINSESZINS=ZINSESZINS+ZINS
210 KAPITALNEU=KAPITAL+ZINS
220 LOCATE LAUF+3,30
230 PRINT USING "  ##";LAUF,
240 PRINT USING " ######.##";KAPITAL;
250 PRINT USING " #####.##";ZINS;
260 PRINT USING "  ######.##";KAPITALNEU;
270 PRINT USING "    ######.##";ZINSESZINS
280 KAPITAL=KAPITALNEU
290 NEXT
300 A$=INKEY$:IF A$="" THEN 300
310 IF A$="+" THEN ZINSSATZ=ZINSSATZ+.25
320 IF A$="-" THEN ZINSSATZ=ZINSSATZ-.25
330 IF A$="k" THEN LOCATE 4,17:PRINT SPACE$(10):LOCATE 4,17:INPUT "",EINGABE
340 WEND
`colorama` alleine wird wohl nicht reichen, weil das nur die Ausgabe abdeckt, aber nicht die direkte Eingabe von einzelnen Zeichen. Da ist das blessed-Modul das Leichtgewichtigste was mir einfällt. Damit sollte sich das Programm relativ leicht von BASIC nach Python portieren lassen. Einzig die Eingabe mitten auf dem Bildschirm könnte problematisch werden. Entweder löst man das anders, oder man schreibt sich eine eigene Eingaberoutine, die den Rest der Zeile nicht verändert.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
grubenfox
User
Beiträge: 422
Registriert: Freitag 2. Dezember 2022, 15:49

__blackjack__ hat geschrieben: Dienstag 21. Februar 2023, 10:16 `colorama` alleine wird wohl nicht reichen, weil das nur die Ausgabe abdeckt, aber nicht die direkte Eingabe von einzelnen Zeichen. Da ist das blessed-Modul das Leichtgewichtigste was mir einfällt. Damit sollte sich das Programm relativ leicht von BASIC nach Python portieren lassen. Einzig die Eingabe mitten auf dem Bildschirm könnte problematisch werden. Entweder löst man das anders, oder man schreibt sich eine eigene Eingaberoutine, die den Rest der Zeile nicht verändert.
Offenbar kann "blessed" da auch die Ausgabe übernehmen. Also so nach den Demos auf der Projektseite. Wobei gleich das erste Beispiel, das mit

Code: Alles auswählen

with term.cbreak(), term.hidden_cursor():
    inp = term.inkey()
ist das nicht schon so eine "Eingabe mitten auf dem Bildschirm"?
Benutzeravatar
__blackjack__
User
Beiträge: 13069
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@grubenfox: Das liest *einen* Tastendruck. Daraus müsste man sich dann ein `input()` nachbauen das den *Rest* der Zeile nicht stört/verändert. Wenn man in dem BASIC-Programm "k" drückt, dann springt der Cursor hinter das "Kapital :" links oben und man kann *dort* eine neue Zahl eingeben und das ohne die Tabelle die rechts davon steht zu stören bzw. ohne das das was dort in der gleichen Zeile steht, die Eingabe beeinflusst.

In BASIC bekommt man die gesamte Eingabe einfach mit einem INPUT (in Zeile 330 ganz am Ende), in Python mit `blessed` müsste man sich so eine Eingaberoutine schreiben. Oder es wie gesagt anders lösen, so dass man einfach `input()` verwenden kann, in einer Zeile wo sonst nichts weiter steht was man durch die Eingabe (inklusive Entfernen-Taste um Fehler zu korrigieren) ”zerstören” kann.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
grubenfox
User
Beiträge: 422
Registriert: Freitag 2. Dezember 2022, 15:49

Aha... Danke! Hach... "BASIC" 8) verdammt lang her... ;)
Benutzeravatar
__blackjack__
User
Beiträge: 13069
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Mal mit `blessed` portiert:

Code: Alles auswählen

#!/usr/bin/env python3
from blessed import Terminal


def main():
    screen = Terminal()
    with screen.fullscreen():
        print(f"{screen.clear}\n Zinseszinzberechnung für 20 Jahre")
        eingabe = float(input("\n Kapital : "))
        zinssatz = float(input("\n Zinssatz : "))
        print(
            f"{screen.clear}{screen.move_yx(1, 7)}"
            f"{screen.reverse} Zinseszinsen {screen.normal}"
            f"{screen.move_yx(23, 0)}" + "=" * 80 + f"{screen.move_yx(24, 6)}"
            f"{screen.reverse}+/-{screen.normal} Zinssatz um 0.25% verändern"
            f"\t{screen.reverse}K{screen.normal}apital verändern "
            f"{screen.reverse}E{screen.normal}nde"
            f"{screen.move_yx(3, 6)}Kapital : {eingabe}"
            f"{screen.move_yx(1, 29)}"
            f"Jahr   Kapital   Zinsen Endkapital Zinseszinsen"
        )
        while True:
            print(f"{screen.move_yx(5, 6)}Zinssatz : {zinssatz:.2f}%   ")
            kapital = eingabe
            zinseszins = 0
            for lauf in range(1, 21):
                zins = kapital * zinssatz / 100
                zinseszins += zins
                kapital_neu = kapital + zins
                print(
                    f"{screen.move_yx(lauf + 2, 29)}"
                    f"{lauf:4d}{kapital:10.2f}{zins:9.2f}{kapital_neu:11.2f}"
                    f"{zinseszins:13.2f}"
                )
                kapital = kapital_neu

            with screen.cbreak():
                key = screen.inkey().lower()

            if key == "e":
                break
            
            if key == "+":
                zinssatz += 0.25
            elif key == "-":
                zinssatz -= 0.25
            elif key == "k":
                eingabe = float(
                    input(
                        f"{screen.move_yx(3, 16)}"
                        + " " * 10
                        + f"{screen.move_yx(3,16)}"
                    )
                )


if __name__ == "__main__":
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
__blackjack__
User
Beiträge: 13069
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Und noch mal als GUI-Anwendung mit `tkinter`:

Code: Alles auswählen

#!/usr/bin/env python3
import tkinter as tk
from functools import partial

YEAR_COUNT = 20


def update_table(capital_var, interest_rate_var, label_rows, *_):
    capital = capital_var.get()
    interest_rate = interest_rate_var.get()
    compound_interest = 0
    for label_row in label_rows:
        interest = capital * interest_rate / 100
        compound_interest += interest
        capital_new = capital + interest
        for label, value in zip(
            label_row, [capital, interest, capital_new, compound_interest]
        ):
            label["text"] = f"{value:.2f}"
        capital = capital_new


def change_interest_rate(interest_rate_var, amount):
    interest_rate_var.set(interest_rate_var.get() + amount)


def main():
    root = tk.Tk()
    root.title(f"Zinseszinsen für {YEAR_COUNT} Jahre")

    capital_var = tk.DoubleVar()
    interest_rate_var = tk.DoubleVar()

    frame = tk.LabelFrame(root, text="Eingabe")
    frame.pack(side=tk.LEFT, anchor=tk.NW, padx=5, pady=5)

    tk.Label(frame, text="Kapital").grid(row=0, column=0, sticky=tk.E)
    tk.Entry(frame, textvariable=capital_var, width=10).grid(
        row=0, column=1, sticky=tk.W
    )

    tk.Label(frame, text="Zinssatz").grid(row=1, column=0, sticky=tk.E)
    tk.Entry(frame, textvariable=interest_rate_var, width=10).grid(
        row=1, column=1, sticky=tk.W
    )
    tk.Label(frame, text="%").grid(row=1, column=2, sticky=tk.E)
    sub_frame = tk.Frame(frame)
    sub_frame.grid(row=2, column=1, columnspan=2)
    tk.Button(
        sub_frame,
        text="+",
        command=partial(change_interest_rate, interest_rate_var, 0.25),
    ).pack(side=tk.LEFT)
    tk.Button(
        sub_frame,
        text="-",
        command=partial(change_interest_rate, interest_rate_var, -0.25),
    ).pack(side=tk.LEFT)
    tk.Label(sub_frame, text="0.25%").pack(side=tk.LEFT)

    headers = ["Jahr", "Kapital", "Zinsen", "Endkapital", "Zinseszinsen"]
    frame = tk.LabelFrame(root, text="Ergebnis")
    frame.pack(side=tk.LEFT, anchor=tk.NW, padx=5, pady=5)
    for column_index, header in enumerate(headers):
        tk.Label(frame, text=header, font="bold").grid(
            row=0, column=column_index, sticky=tk.E, padx=5
        )

    label_rows = []
    for row_index in range(1, YEAR_COUNT + 1):
        tk.Label(frame, text=row_index).grid(
            row=row_index, column=0, sticky=tk.E, padx=5
        )
        label_row = []
        for column_index in range(1, len(headers)):
            label = tk.Label(frame)
            label.grid(row=row_index, column=column_index, sticky=tk.E, padx=5)
            label_row.append(label)
        label_rows.append(label_row)

    on_change = partial(
        update_table, capital_var, interest_rate_var, label_rows
    )
    for variable in [capital_var, interest_rate_var]:
        variable.trace_add("write", on_change)
    on_change()

    root.mainloop()


if __name__ == "__main__":
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
Dennis89
User
Beiträge: 1153
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo __blackjack__,

wenn ich das erste mal ein Kapital eingeben will, dann bekomme ich einen Fehler:

Code: Alles auswählen

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\Dennis\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", line 1892, in __call__
    return self.func(*args)
  File "C:\Users\Dennis\AppData\Roaming\JetBrains\PyCharmCE2021.2\scratches\scratch_7.py", line 9, in update_table
    capital = capital_var.get()
  File "C:\Users\Dennis\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", line 568, in get
    return self._tk.getdouble(self._tk.globalgetvar(self._name))
_tkinter.TclError: expected floating-point number but got ""
Da wird die 'update_table' das erste mal "zu schnell" aufgerufen, bevor ich etwas eingegeben habe. (Oder?)

Ich würde das vielleicht so lösen.

Code: Alles auswählen

def update_table(capital_var, interest_rate_var, label_rows, *_):
    try:
        capital = capital_var.get()
        interest_rate = interest_rate_var.get()
    except tk.TclError:
        return
    compound_interest = 0
    for label_row in label_rows:
        interest = capital * interest_rate / 100
        compound_interest += interest
        capital_new = capital + interest
        for label, value in zip(
            label_row, [capital, interest, capital_new, compound_interest]
        ):
            label["text"] = f"{value:.2f}"
        capital = capital_new
Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
__blackjack__
User
Beiträge: 13069
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Dennis89: Ich persönlich würde das nicht abfangen. Sind halt erwartbare Ausnahmen, die der Benutzer normalerweise nicht sieht.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
Dennis89
User
Beiträge: 1153
Registriert: Freitag 11. Dezember 2020, 15:13

Guten Morgen,

achsoo, ich bin bis jetzt immer davon ausgegangen, dass alles was "vorhersehbar" ist abgefangen werden soll, unabhängig davon wer die Meldung sieht und ob das Programm weiter läuft oder nicht.
Das ist gut zu wissen, dass man das auch belassen könnte.

So jetzt will ich euch aber hier nicht länger vom eigentlichen Thema ablenken.

Danke und Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
__blackjack__
User
Beiträge: 13069
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Man könnte auch Qt für die GUI nehmen. Das entsprechende Eingabe-Element `QDoubleSpinBox` löst nur ein Signal aus, wenn eine gültige Zahl im Feld steht und einen anderen Wert hat, als die letzte gültige Zahl, die im Feld stand. Damit kann also bei der Abfrage im Slot keine Ausnahme auftreten. 😀

Code: Alles auswählen

#!/usr/bin/env python3
import sys
from functools import partial

from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (
    QApplication,
    QDoubleSpinBox,
    QFormLayout,
    QGroupBox,
    QHBoxLayout,
    QTableWidget,
    QTableWidgetItem,
    QWidget,
)

YEAR_COUNT = 20


def update_results(
    table_widget, capital_entry, interest_rate_entry, _value=None
):
    capital = capital_entry.value()
    interest_rate = interest_rate_entry.value()
    compound_interest = 0
    for row_index in range(YEAR_COUNT):
        interest = capital * interest_rate / 100
        new_capital = capital + interest
        compound_interest += interest
        for column_index, value in enumerate(
            [capital, interest, new_capital, compound_interest]
        ):
            item = QTableWidgetItem(f"{value:.2f}")
            item.setTextAlignment(Qt.AlignRight | Qt.AlignCenter)
            table_widget.setItem(row_index, column_index, item)
            capital = new_capital


def main():
    app = QApplication(sys.argv)
    window = QWidget(windowTitle=f"Zinseszinsen für {YEAR_COUNT} Jahre")

    input_group_box = QGroupBox("Eingabe")
    capital_entry = QDoubleSpinBox(maximum=100_000_000)
    interest_rate_entry = QDoubleSpinBox(
        maximum=10_000, singleStep=0.25, suffix=" %"
    )
    layout = QFormLayout(input_group_box)
    layout.addRow("Kapital", capital_entry)
    layout.addRow("Zinssatz", interest_rate_entry)

    result_group_box = QGroupBox("Ergebnis")
    headers = ["Kapital", "Zinsen", "Endkapital", "Zinseszinsen"]
    result_table_widget = QTableWidget(YEAR_COUNT, len(headers))
    result_table_widget.setHorizontalHeaderLabels(headers)
    result_table_widget.setMinimumSize(
        result_table_widget.verticalHeader().width()
        + sum(
            map(
                result_table_widget.columnWidth,
                range(result_table_widget.columnCount()),
            )
        )
        + 6,
        result_table_widget.horizontalHeader().height()
        + sum(
            map(
                result_table_widget.rowHeight,
                range(result_table_widget.rowCount()),
            )
        )
        + 6,
    )
    layout = QHBoxLayout(result_group_box)
    layout.addWidget(result_table_widget)

    layout = QHBoxLayout(window)
    layout.addWidget(input_group_box)
    layout.addWidget(result_group_box)

    on_value_change = partial(
        update_results, result_table_widget, capital_entry, interest_rate_entry
    )
    capital_entry.valueChanged.connect(on_value_change)
    interest_rate_entry.valueChanged.connect(on_value_change)

    window.show()
    app.exec()


if __name__ == "__main__":
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
Dennis89
User
Beiträge: 1153
Registriert: Freitag 11. Dezember 2020, 15:13

Und optisch ist es auch noch wesentlich schöner :)
"When I got the music, I got a place to go" [Rancid, 1993]
gerdk
User
Beiträge: 7
Registriert: Freitag 17. Februar 2023, 19:52

So macht es einfach Spaß, eine neue Programmiersprache zu lernen, vielen Dank für die Antworten, speziell an blackjack.
Gruß und schönen Sonntag
Gerd
Antworten