Informatik10/tk_first_steps/feet.py

115 lines
3.2 KiB
Python
Raw Normal View History

2021-11-02 11:35:51 +00:00
from tkinter import *
from tkinter import ttk
2021-11-28 16:42:09 +00:00
status = 1
def switch_status(newS: int = None):
global status
if not newS:
if status == 1:
status = 2
else:
status = 1
else:
status = newS
update_statusbar()
def update_statusbar():
global status
if status == 1:
frame_statusbar['style'] = 'aFrame.TFrame'
elif status == 2:
frame_statusbar['style'] = 'bFrame.TFrame'
else:
frame_statusbar['style'] = 'bFrame.TFrame'
2021-11-02 11:35:51 +00:00
def calculate(*args):
try:
stringvalue = feet.get()
stringvalue = stringvalue.replace(",",".")
value = float(stringvalue)
m_value = 0.3048 * value
m_value = round(m_value, 2)
meters.set(m_value)
2021-11-28 16:42:09 +00:00
switch_status(2)
2021-11-02 11:35:51 +00:00
except ValueError:
pass
return True
2021-11-28 16:42:09 +00:00
def check_entry(what):
switch_status(1)
if what == "":
# Nichts eingegeben
return True
else:
try:
# DEBUG
print(what)
float(what)
return True
except ValueError:
return False
2021-11-02 11:35:51 +00:00
# Hauptfenster
root = Tk()
root.title("Feet to Meters")
2021-11-28 16:42:09 +00:00
check_entry_wrapper = root.register(check_entry)
2021-11-02 11:35:51 +00:00
# Rahmen im Hauptfenster (aus ttk für Farbanpassung)
mainframe = ttk.Frame(root, padding = "3 3 12 12")
2021-11-28 16:42:09 +00:00
mainframe.grid(column = 0, row = 0, sticky = NW)
2021-11-02 11:35:51 +00:00
root.columnconfigure(0, weight = 1)
root.rowconfigure(0, weight = 1)
# Eingabefeld für Länge in feet
feet = StringVar()
2021-11-28 16:42:09 +00:00
feet_entry = ttk.Entry(mainframe, width = 7, textvariable = feet,
validatecommand = (check_entry_wrapper, '%P'),
validate = 'key')
2021-11-02 11:35:51 +00:00
feet_entry.grid(column = 2, row = 1, sticky = (W, E))
# Einheit-Label für Eingabefeld der Länge in feet
ttk.Label(mainframe, text = "feet").grid(column = 3, row = 1, sticky = W)
# Label für Ausgabefeld der Länge in Metern
ttk.Label(mainframe, text = "ist äquivalent zu").grid(column = 1, row = 2, sticky = E)
# Einheit-Label für Ausgabefeld der Länge in Metern
ttk.Label(mainframe, text = "Meter").grid(column = 3, row = 2, sticky = W)
# Ausgabefeld für Länge in Metern
meters = StringVar()
meters_entry = ttk.Entry(mainframe, width = 7, textvariable = meters)
meters_entry.grid(column = 2, row = 2, sticky = (W,E))
2021-11-28 16:42:09 +00:00
meters_entry.configure(state = 'readonly') # keine Eingabe, aber selektierbar
2021-11-02 11:35:51 +00:00
# Button für Berechnung
button_calc = ttk.Button(mainframe, text = "Berechne", command = calculate)
button_calc.grid(column = 3, row = 3, sticky = W)
# schönere Abstände
for child in mainframe.winfo_children():
child.grid_configure(padx = 5, pady = 5)
2021-11-28 16:42:09 +00:00
# Statusbar
s = ttk.Style()
s.configure('aFrame.TFrame', background = "yellow")
s.configure('bFrame.TFrame', background = "green")
s.configure('cFrame.TFrame', background = "red")
frame_statusbar = ttk.Frame(root)
frame_statusbar['relief'] = 'sunken'
frame_statusbar['height'] = 12
frame_statusbar['style'] = 'aFrame.TFrame'
frame_statusbar.grid_propagate(0) # Feste Größe an Grid-Packer weitergeben
frame_statusbar.grid(column = 0, row = 1, sticky = W+S+E)
2021-11-02 11:35:51 +00:00
# Setze Fokus in Eingabefeld
feet_entry.focus()
root.bind("<Return>", calculate)
root.bind("<KP_Enter>", calculate)
root.mainloop()