Scrollbar im falschen frame
Verfasst: Freitag 15. November 2024, 18:22
Hallo, bei folgendem Programm funktioniert die ScrolBar im "ergebnis_frame" (soll da nicht sein),
nicht jedoch in dem inner_frame, wo die Tabelle erstellt wird.
Was mache ich falsch?
import tkinter as tk
from tkscrolledframe import ScrolledFrame
import math
def validate_number(text):
try:
if text:
_ = float(text.replace(',', ','))
except ValueError:
print("error")
return False
return True
def main(darlehen, zinssatz, rate, zbindung, zins2, sondertilgung):
print("\nTilgungsplan:\n")
print("Monat Zinssatz Tilgung Rest Sumzinsen Sonderz")
summezinsen = 0
monat = 1
rest = float(darlehen)
zins1 = float(zinssatz)
for widget in ergebnis_frame.winfo_children():
widget.grid_forget()
ueberschriften = ["Monat", "Zinssatz", "Tilgung", "Sonderzahlung", "Restschuld"]
for column_index, ueberschriften in enumerate(ueberschriften):
tk.Label(ergebnis_frame, text=ueberschriften,
font="bold").grid(row=0, column=column_index, sticky="e", padx=5)
while rest > 0:
#merkerest = rest
if (monat <= zbindung * 12):
zins = zins1
else:
zins = zins2
zinsen = rest * zins / 1200 # Zinsen berechnen
summezinsen += zinsen
tilgung = rate - zinsen
if tilgung > rest:
tilgung = rest
rest -= tilgung
sonderz = 0
if ((monat % 12) == 0):
sonderz = sondertilgung
if (sonderz > rest):
sonderz = rest
rest -= sonderz
zeilemonat = monat
monat += 1
if math.copysign(1, tilgung) == -1:
print("The number is negative")
fehler = tk.Label(ergebnis_frame, text="Zinssatz zu hoch oder Rate zu niedrig", bg="red")
fehler.grid(row=2, column=0, columnspan=4)
rest = 0
print("%2d" % zeilemonat, " ", end='')
print('\t{0:5.2f}'.format(zins), '\t{0:8.2f}'.format(tilgung),
'\t{0:8.2f}'.format(rest), '\t{0:8.2f}'.format(summezinsen),
'\t{0:4.2f}'.format(sonderz))
labelmonat = tk.Label(ergebnis_frame, background='#CDC2AE', width='3')
labelmonat.grid(row=zeilemonat, column=0, padx='5', pady='5')
labelmonat.config(text="{:.0f}".format(zeilemonat))
labelzinsen = tk.Label(ergebnis_frame, background='#CDC2AE', width='6')
labelzinsen.grid(row=zeilemonat, column=1, padx='5', pady='5')
labelzinsen.config(text="{0:10.2f}".format(zins))
labeltilgung = tk.Label(ergebnis_frame, background='#CDC2AE', width='7')
labeltilgung.grid(row=zeilemonat, column=2, padx='5', pady='5')
labeltilgung.config(text="{0:10.2f}".format(tilgung))
labelsonderz = tk.Label(ergebnis_frame, background='#CDC2AE', width='7')
labelsonderz.grid(row=zeilemonat, column=3, padx='5', pady='5')
labelsonderz.config(text="{0:10.2f}".format(sonderz))
labelrest_kapital = tk.Label(ergebnis_frame, background='#CDC2AE', width='7')
labelrest_kapital.grid(row=zeilemonat, column=4, padx='10', pady='5')
labelrest_kapital.config(text="{0:10.2f}".format(rest))
# Monate in Jahr und Monate
if monat % 12 == 0:
jahr = monat / 12
restmonate = 0
else:
jahr = int(monat / 12)
restmonate = monat % 12
if restmonate == 0:
jahr = jahr - 1
restmonate = 12
print("Jahre = ", jahr, "Restmonate = ", restmonate - 1)
tk.Label(sum_frame, text="Jahre", bg="#FCFFB2").grid(sticky="w", row=2, column=3)
tk.Label(sum_frame, text="Monate", bg="#FCFFB2").grid(sticky="w", row=3, column=3)
tk.Label(sum_frame, text="Summe Zinsen", bg="#FCFFB2").grid(sticky="w", row=4, column=3)
labeljahre = tk.Label(sum_frame, width='7', anchor="e", fg="blue")
labeljahre.grid(row=2, column=1, padx='5', pady='5')
labeljahre.config(text="{:.0f}".format(jahr))
labelmonate = tk.Label(sum_frame, width='7', anchor="e")
labelmonate.grid(row=3, column=1, padx='5', pady='5')
labelmonate.config(text="{:.0f}".format(restmonate - 1))
labelsummezinsen = tk.Label(sum_frame, width='7', anchor="e", fg="red")
labelsummezinsen.grid(row=4, column=1, padx='5', pady='5')
labelsummezinsen.config(text="{0:9.2f}".format(summezinsen))
print(f"Summe Zinsen: {summezinsen:.2f}")
def enter_data():
rest = float(darlehen_entry.get())
zins1 = float(zinssatz_entry.get())
rate = float(rate_entry.get())
zbindung = float(zbindung_entry.get())
zins2 = float(zins2_entry.get())
sondertilgung = float(sondertilgung_entry.get())
main(rest, zins1, rate, zbindung, zins2, sondertilgung)
window = tk.Tk()
window.title("Darlehen zurückzahlen")
window.geometry("900x500")
validation = (window.register(validate_number), '%P')
frame = tk.LabelFrame(text="Eingabe", width=400, height=400)
frame.pack(side=tk.LEFT, anchor="n", padx=5, pady=5)
eingabe_frame = tk.LabelFrame(frame, relief='raised', text="Eingabefelder")
eingabe_frame.grid(row=0, column=0, sticky="n", padx=5, pady=5)
sum_frame = tk.LabelFrame(eingabe_frame, text="Ergebnis zusammengefaßt",
width=200, height=200, relief='raised')
sum_frame.grid(row=10, column=0, sticky="news", padx=5, pady=5, columnspan=3)
darlehen_label = tk.Label(eingabe_frame, anchor="w", text="Darlehen", width=15, padx=15)
darlehen_label.grid(row=1, column=0)
zinssatz_label = tk.Label(eingabe_frame, anchor="w", text="Zinssatz", width=15)
zinssatz_label.grid(row=2, column=0)
rate_label = tk.Label(eingabe_frame, anchor="w", text="Rate", width=15)
rate_label.grid(row=3, column=0)
zbindung_label = tk.Label(eingabe_frame, anchor="w", text="Zinsbindung (Jahre)", width=15)
zbindung_label.grid(row=4, column=0)
zins2_label = tk.Label(eingabe_frame, anchor="w", text="Zinssatz nach Bindung", width=15)
zins2_label.grid(row=5, column=0)
sondertilgung_label = tk.Label(eingabe_frame, anchor="w", text="jährl. Sondertilgung", width=15)
sondertilgung_label.grid(row=6, column=0)
sondertilgung_entry = tk.DoubleVar()
sondertilgung_entry.insert = (0)
darlehen_entry = tk.Entry(eingabe_frame, width=6, validate="key", validatecommand=validation)
zinssatz_entry = tk.Entry(eingabe_frame, width=6, validate="key", validatecommand=validation)
rate_entry = tk.Entry(eingabe_frame, width=6, validate="key", validatecommand=validation)
zbindung_entry = tk.Entry(eingabe_frame, width=6, validate="key", validatecommand=validation)
zins2_entry = tk.Entry(eingabe_frame, width=6, validate="key", validatecommand=validation)
sondertilgung_entry = tk.Entry(eingabe_frame, textvariable=sondertilgung_entry, width=6, validate="key", validatecommand=validation)
darlehen_entry.grid(row=1, column=2)
zinssatz_entry.grid(row=2, column=2)
rate_entry.grid(row=3, column=2)
zbindung_entry.grid(row=4, column=2)
zins2_entry.grid(row=5, column=2)
sondertilgung_entry.grid(row=6, column=2)
sf = ScrolledFrame(width=700, height=800)
sf.pack()
inner_frame = sf.display_widget(tk.Frame)
sf.bind_arrow_keys(inner_frame)
sf.bind_scroll_wheel(inner_frame)
frame = tk.LabelFrame(inner_frame, text="Ergebnis")
frame.pack(side=tk.TOP, anchor="n", padx=5, pady=5)
ergebnis_frame = tk.LabelFrame(frame, text="Monate Ergebnis / Jahre",
width=500, height=500, relief='raised')
ergebnis_frame.grid(row=1, column=0, sticky="ne", padx=5, pady=5)
button = tk.Button(eingabe_frame, text="rechne", bg="gray", fg="blue", command=enter_data)
button.grid(row=1, column=4, sticky="news", padx=20, pady=10)
window.mainloop()
nicht jedoch in dem inner_frame, wo die Tabelle erstellt wird.
Was mache ich falsch?
import tkinter as tk
from tkscrolledframe import ScrolledFrame
import math
def validate_number(text):
try:
if text:
_ = float(text.replace(',', ','))
except ValueError:
print("error")
return False
return True
def main(darlehen, zinssatz, rate, zbindung, zins2, sondertilgung):
print("\nTilgungsplan:\n")
print("Monat Zinssatz Tilgung Rest Sumzinsen Sonderz")
summezinsen = 0
monat = 1
rest = float(darlehen)
zins1 = float(zinssatz)
for widget in ergebnis_frame.winfo_children():
widget.grid_forget()
ueberschriften = ["Monat", "Zinssatz", "Tilgung", "Sonderzahlung", "Restschuld"]
for column_index, ueberschriften in enumerate(ueberschriften):
tk.Label(ergebnis_frame, text=ueberschriften,
font="bold").grid(row=0, column=column_index, sticky="e", padx=5)
while rest > 0:
#merkerest = rest
if (monat <= zbindung * 12):
zins = zins1
else:
zins = zins2
zinsen = rest * zins / 1200 # Zinsen berechnen
summezinsen += zinsen
tilgung = rate - zinsen
if tilgung > rest:
tilgung = rest
rest -= tilgung
sonderz = 0
if ((monat % 12) == 0):
sonderz = sondertilgung
if (sonderz > rest):
sonderz = rest
rest -= sonderz
zeilemonat = monat
monat += 1
if math.copysign(1, tilgung) == -1:
print("The number is negative")
fehler = tk.Label(ergebnis_frame, text="Zinssatz zu hoch oder Rate zu niedrig", bg="red")
fehler.grid(row=2, column=0, columnspan=4)
rest = 0
print("%2d" % zeilemonat, " ", end='')
print('\t{0:5.2f}'.format(zins), '\t{0:8.2f}'.format(tilgung),
'\t{0:8.2f}'.format(rest), '\t{0:8.2f}'.format(summezinsen),
'\t{0:4.2f}'.format(sonderz))
labelmonat = tk.Label(ergebnis_frame, background='#CDC2AE', width='3')
labelmonat.grid(row=zeilemonat, column=0, padx='5', pady='5')
labelmonat.config(text="{:.0f}".format(zeilemonat))
labelzinsen = tk.Label(ergebnis_frame, background='#CDC2AE', width='6')
labelzinsen.grid(row=zeilemonat, column=1, padx='5', pady='5')
labelzinsen.config(text="{0:10.2f}".format(zins))
labeltilgung = tk.Label(ergebnis_frame, background='#CDC2AE', width='7')
labeltilgung.grid(row=zeilemonat, column=2, padx='5', pady='5')
labeltilgung.config(text="{0:10.2f}".format(tilgung))
labelsonderz = tk.Label(ergebnis_frame, background='#CDC2AE', width='7')
labelsonderz.grid(row=zeilemonat, column=3, padx='5', pady='5')
labelsonderz.config(text="{0:10.2f}".format(sonderz))
labelrest_kapital = tk.Label(ergebnis_frame, background='#CDC2AE', width='7')
labelrest_kapital.grid(row=zeilemonat, column=4, padx='10', pady='5')
labelrest_kapital.config(text="{0:10.2f}".format(rest))
# Monate in Jahr und Monate
if monat % 12 == 0:
jahr = monat / 12
restmonate = 0
else:
jahr = int(monat / 12)
restmonate = monat % 12
if restmonate == 0:
jahr = jahr - 1
restmonate = 12
print("Jahre = ", jahr, "Restmonate = ", restmonate - 1)
tk.Label(sum_frame, text="Jahre", bg="#FCFFB2").grid(sticky="w", row=2, column=3)
tk.Label(sum_frame, text="Monate", bg="#FCFFB2").grid(sticky="w", row=3, column=3)
tk.Label(sum_frame, text="Summe Zinsen", bg="#FCFFB2").grid(sticky="w", row=4, column=3)
labeljahre = tk.Label(sum_frame, width='7', anchor="e", fg="blue")
labeljahre.grid(row=2, column=1, padx='5', pady='5')
labeljahre.config(text="{:.0f}".format(jahr))
labelmonate = tk.Label(sum_frame, width='7', anchor="e")
labelmonate.grid(row=3, column=1, padx='5', pady='5')
labelmonate.config(text="{:.0f}".format(restmonate - 1))
labelsummezinsen = tk.Label(sum_frame, width='7', anchor="e", fg="red")
labelsummezinsen.grid(row=4, column=1, padx='5', pady='5')
labelsummezinsen.config(text="{0:9.2f}".format(summezinsen))
print(f"Summe Zinsen: {summezinsen:.2f}")
def enter_data():
rest = float(darlehen_entry.get())
zins1 = float(zinssatz_entry.get())
rate = float(rate_entry.get())
zbindung = float(zbindung_entry.get())
zins2 = float(zins2_entry.get())
sondertilgung = float(sondertilgung_entry.get())
main(rest, zins1, rate, zbindung, zins2, sondertilgung)
window = tk.Tk()
window.title("Darlehen zurückzahlen")
window.geometry("900x500")
validation = (window.register(validate_number), '%P')
frame = tk.LabelFrame(text="Eingabe", width=400, height=400)
frame.pack(side=tk.LEFT, anchor="n", padx=5, pady=5)
eingabe_frame = tk.LabelFrame(frame, relief='raised', text="Eingabefelder")
eingabe_frame.grid(row=0, column=0, sticky="n", padx=5, pady=5)
sum_frame = tk.LabelFrame(eingabe_frame, text="Ergebnis zusammengefaßt",
width=200, height=200, relief='raised')
sum_frame.grid(row=10, column=0, sticky="news", padx=5, pady=5, columnspan=3)
darlehen_label = tk.Label(eingabe_frame, anchor="w", text="Darlehen", width=15, padx=15)
darlehen_label.grid(row=1, column=0)
zinssatz_label = tk.Label(eingabe_frame, anchor="w", text="Zinssatz", width=15)
zinssatz_label.grid(row=2, column=0)
rate_label = tk.Label(eingabe_frame, anchor="w", text="Rate", width=15)
rate_label.grid(row=3, column=0)
zbindung_label = tk.Label(eingabe_frame, anchor="w", text="Zinsbindung (Jahre)", width=15)
zbindung_label.grid(row=4, column=0)
zins2_label = tk.Label(eingabe_frame, anchor="w", text="Zinssatz nach Bindung", width=15)
zins2_label.grid(row=5, column=0)
sondertilgung_label = tk.Label(eingabe_frame, anchor="w", text="jährl. Sondertilgung", width=15)
sondertilgung_label.grid(row=6, column=0)
sondertilgung_entry = tk.DoubleVar()
sondertilgung_entry.insert = (0)
darlehen_entry = tk.Entry(eingabe_frame, width=6, validate="key", validatecommand=validation)
zinssatz_entry = tk.Entry(eingabe_frame, width=6, validate="key", validatecommand=validation)
rate_entry = tk.Entry(eingabe_frame, width=6, validate="key", validatecommand=validation)
zbindung_entry = tk.Entry(eingabe_frame, width=6, validate="key", validatecommand=validation)
zins2_entry = tk.Entry(eingabe_frame, width=6, validate="key", validatecommand=validation)
sondertilgung_entry = tk.Entry(eingabe_frame, textvariable=sondertilgung_entry, width=6, validate="key", validatecommand=validation)
darlehen_entry.grid(row=1, column=2)
zinssatz_entry.grid(row=2, column=2)
rate_entry.grid(row=3, column=2)
zbindung_entry.grid(row=4, column=2)
zins2_entry.grid(row=5, column=2)
sondertilgung_entry.grid(row=6, column=2)
sf = ScrolledFrame(width=700, height=800)
sf.pack()
inner_frame = sf.display_widget(tk.Frame)
sf.bind_arrow_keys(inner_frame)
sf.bind_scroll_wheel(inner_frame)
frame = tk.LabelFrame(inner_frame, text="Ergebnis")
frame.pack(side=tk.TOP, anchor="n", padx=5, pady=5)
ergebnis_frame = tk.LabelFrame(frame, text="Monate Ergebnis / Jahre",
width=500, height=500, relief='raised')
ergebnis_frame.grid(row=1, column=0, sticky="ne", padx=5, pady=5)
button = tk.Button(eingabe_frame, text="rechne", bg="gray", fg="blue", command=enter_data)
button.grid(row=1, column=4, sticky="news", padx=20, pady=10)
window.mainloop()