Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import division
import Tkinter as tk
from functools import partial
from itertools import izip, starmap, tee
from operator import mul
MARKS = xrange(1, 7)
def calculate_average(mark2count):
return (
sum(starmap(mul, mark2count.iteritems())) / sum(mark2count.itervalues())
)
def set_focus_to_entry(entry):
entry.focus_set()
entry.select_range(0, tk.END)
def create_mark_frame(parent, marks):
mark_frame = tk.LabelFrame(parent, text='Noten')
tk.Label(mark_frame, text='Note').grid(row=0, column=0)
tk.Label(mark_frame, text='Anzahl').grid(row=0, column=1)
mark2entry = dict()
for i, mark in enumerate(marks):
tk.Label(mark_frame, text=str(mark)).grid(row=i + 1, column=0)
entry = tk.Entry(mark_frame, width=5)
entry.insert(0, '0')
entry.grid(row=i + 1, column=1)
mark2entry[mark] = entry
return mark_frame, mark2entry
def create_result_frame(parent):
result_frame = tk.LabelFrame(parent, text='Ergebnis')
result_entry = tk.Entry(result_frame)
result_entry.pack(expand=True, fill=tk.BOTH)
def set_result_entry(value):
result_entry.config(state=tk.NORMAL)
result_entry.delete(0, tk.END)
result_entry.insert(0, value)
result_entry.config(state='readonly')
return result_frame, set_result_entry
def do_average(mark2entry, set_result_entry):
try:
mark2count = dict()
for mark, entry in mark2entry.iteritems():
count = int(entry.get())
if count < 0:
set_result_entry('Negative Anzahl!?')
set_focus_to_entry(entry)
return
mark2count[mark] = count
except ValueError:
set_result_entry(u'Keine gültige Anzahl.')
set_focus_to_entry(entry)
else:
try:
set_result_entry(calculate_average(mark2count))
except ZeroDivisionError:
set_result_entry(u'Keine Arbeiten → kein Durchschnitt.')
def main():
root = tk.Tk()
mark_frame, mark2entry = create_mark_frame(root, MARKS)
mark_frame.pack(expand=True, fill=tk.BOTH)
button = tk.Button(root, text='Schnitt berechnen')
button.pack(expand=True, fill=tk.BOTH)
result_frame, set_result_entry = create_result_frame(root)
result_frame.pack(expand=True, fill=tk.BOTH)
set_result_entry(u'Anzahlen eingeben…')
button.config(command=partial(do_average, mark2entry, set_result_entry))
root.mainloop()
if __name__ == "__main__":
main()