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
basic-Programm nach Python
- noisefloor
- User
- Beiträge: 4159
- 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
`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
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.
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.
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?
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?
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.
Eigentlich sollte curses dabei sein. Du schreibst "cures". Das existiert nicht. Kann natuerlich nur hier ein Fehler sein, aber die genau Schreibweise ist wichtig.
- noisefloor
- User
- Beiträge: 4159
- 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
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
- __blackjack__
- User
- Beiträge: 13938
- 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.
Das ist ein in Python geschriebener GW-BASIC-Interpreter.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
— Scott Bellware
- __blackjack__
- User
- Beiträge: 13938
- 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:
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:
`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.
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
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
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
— Scott Bellware
Offenbar kann "blessed" da auch die Ausgabe übernehmen. Also so nach den Demos auf der Projektseite. Wobei gleich das erste Beispiel, das mit__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.
Code: Alles auswählen
with term.cbreak(), term.hidden_cursor():
inp = term.inkey()
_______________________________________________________________________________
https://www.python-kurs.eu/index.php
https://learnxinyminutes.com/docs/python/ https://learnxinyminutes.com/docs/de-de/python-de/
https://quickref.me/python https://docs.python-guide.org/
- __blackjack__
- User
- Beiträge: 13938
- 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.
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.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
— Scott Bellware
Aha... Danke! Hach... "BASIC"
verdammt lang her... 


_______________________________________________________________________________
https://www.python-kurs.eu/index.php
https://learnxinyminutes.com/docs/python/ https://learnxinyminutes.com/docs/de-de/python-de/
https://quickref.me/python https://docs.python-guide.org/
- __blackjack__
- User
- Beiträge: 13938
- 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()
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
— Scott Bellware
- __blackjack__
- User
- Beiträge: 13938
- 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()
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
— Scott Bellware
Hallo __blackjack__,
wenn ich das erste mal ein Kapital eingeben will, dann bekomme ich einen Fehler:
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.
Grüße
Dennis
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 ""
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
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
- __blackjack__
- User
- Beiträge: 13938
- 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.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
— Scott Bellware
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
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]
- __blackjack__
- User
- Beiträge: 13938
- 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()
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
— Scott Bellware