localtime variable in Pickle Dateinamen nutzen

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.
BlackJack

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()
Newcomer
User
Beiträge: 131
Registriert: Sonntag 15. Mai 2011, 20:41

Danke, genau das habe ich gemeint. Zwar kenn ich die Hälfte der Module nicht, versteh aber den Quellcode.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Newcomer hat geschrieben:Denn kritisieren kann ich auch, aber zu zeigen, dass man etwas kann fällt dann vielen schwerer.
Es fällt nicht unbedingt schwerer - wobei auch das in manchen Fällen zutreffen mag -, aber ist doch meist mit mehr Arbeit verbunden (auch das trifft nicht immer zu - bei einem kleinen Snippet ist es manchmal weniger Arbeit, eine gute Lösung zu posten, als zu beschreiben, warum der gezeigte Code in der Form nicht gut ist).

Mit meiner "Kritik" wollte ich nur darauf hinweisen, dass man ein Programm nicht vorschnell als "funktionsfähig" bezeichnen sollte, weil es bei bestimmten Eingaben anscheinend korrekt funktioniert. Sicher, man kann sich auf den Standpunkt stellen, dass ein "normaler Anwender" (im konkreten Fall wird das wahrscheinlich außer dir selbst niemand sein) die Felder mit zulässigen Werten befüllt und man das darum gar nicht zu prüfen braucht. Konsequenterweise hättest du dann die Prüfung auf leere Felder auch gleich weglassen sollen.

Ein "ordentliches" Programm ist aber so konstruiert, dass es mit JEDER denkbaren Eingabe irgendetwas anzufangen weiß und keinen Laufzeitfehler produziert. Im konkreten Fall wäre es für dich ja auch - so denk ich - problemlos möglich gewesen, eine Überprüfung der noch verbleibenden Fälle unzulässiger Eingaben in deinem Code zu ergänzen.
Newcomer
User
Beiträge: 131
Registriert: Sonntag 15. Mai 2011, 20:41

Ok OK ich entschuldige mich ja. Ich hab aber nicht dich mit der Kritik gemeint, sondern EyDu (-;
Antworten