Datum/Zeit

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.
Antworten
Osterhase
User
Beiträge: 7
Registriert: Freitag 4. April 2014, 09:25

Hallo :arrow: :!:

Ich habe ein Problemo. In einem Programm (Tkinter Eingabefeld) muss man das Datum und die Zeit eingeben. Das Datum im Format ttmmjjjj und die Zeit hhmm. Ich möchte jetzt aber, dass das Datum mit Punkt geschrieben wird also jj.mm.jjjj und die Zeit mit Doppelpunkt also hh:mm. Ich habe kein Plan wie ich das anstellen soll.

Helft mir oder ich fresse die Eier alleine, der Osterhase! :roll: :K
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@Osterhase: ich verstehe die Frage nicht, statt ohne Punkte etwas mit Punkten zu schreiben oder einzulesen, bedeutet doch nur, an die richtige Stelle Punkte einzufügen. Ohne Code kann ich da aber nicht sagen wo.
bfm
User
Beiträge: 88
Registriert: Donnerstag 14. März 2013, 09:42

hallo,

hier mal meinen groben Entwurf, wie ich das Problem lösen würde:

1. Ich würde dem Datum und der Uhrzeit je ein eigenes Entry-Widget gönnen. Es ist zwar Geschmackssache, aber ich finde es datenerfassungstechnisch besser, wenn die beiden Felder getrennt sind. Die an das Widget gebundene Variable sollte vom Typ string (siehe Punkt 4 und 5) sein.
2. An die Widgets würde ich Bindings hängen, die auf die Events TAB und KP_Enter (Enter am Zahlenblock) reagieren, dh der Anwender drückt TAB oder KP_Enter und das Programm führt die im Binding definierte Funktion/Methode (einer Klasse, in diesem Fall der GUI) aus.
3. Für das Datum und für die Uhrzeit gibt es jeweils eine eigene Funktion/Methode.
4. Die Funktion/Methode prüft das Datum auf logische Richtigkeit. Darf es in der Zukunft liegen, wie weit darf es in die Vergangenheit reichen usw. Anschließend das Datum in die Bestandteile TT MM JJJJ trennen, mit Punkten wieder zusammenfügen und zurück in die an das Widget gebundene Variable schreiben.
5. Die Funktion/Methode für die Uhrzeit analog 4.

Eine andere Variante wäre noch, wenn der Anwender das Datum und die Uhrzeit mit Komma eingibt. Für Strings gibt es nämlich schon eine Standardmethode, die Zeichen in dem String ersetzt. Da würde das trennen und wieder zusammenfügen entfallen. Einfach die Kommas durch Punkte und Doppelpunkt ersetzen.

Viel Spaß bei der Umsetzung so oder so ähnlich!
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Lass den Benutzer seine Eingaben machen.
Nachdem der Benutzer fertig ist (Return oder Eingabefeld verliert Fokus) wertest Du die Eingabe mit time.strptime aus und fängst den ValueError Fehler ab. In der Fehlerbehandlung machst Du den Benutzer darauf aufmerksam, dass seine Eingabe nicht korrekt ist (Messagebox und/oder Eingabefeld rot umranden).

Code: Alles auswählen

import time

try:
    datum = time.strptime("10.06.2014", "%d.%m.%Y")
    print("Datum:", datum)
    zeit = time.strptime("16:27", "%H:%M")
    print("Zeit:", zeit)
    datumMitZeit = time.strptime("10.06.2014 16:27", "%d.%m.%Y %H:%M")
    print("Datum mit Uhrzeit:", datumMitZeit)
except ValueError, ex:
    print(ex)
    
try:
    datum = time.strptime("2014/06/10", "%d.%m.%Y")
    print("Datum:", datum)
except ValueError, ex:
    print(ex)
    
try:
    zeit = time.strptime("16:27:08", "%H:%M")
    print("Zeit:", zeit)
except ValueError, ex:
    print(ex)
a fool with a tool is still a fool, www.magben.de, YouTube
Osterhase
User
Beiträge: 7
Registriert: Freitag 4. April 2014, 09:25

@MagBen Ich möchte das es wie gesagt 3 verschiedene Eingaben machen, Beispiel für Tag:

Code: Alles auswählen

from Tkinter import *
#Tag
root = Tk()
var1  = StringVar()
var1.set("Tag")
 
o = OptionMenu(root, var1, "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31")
o.pack()
 
l = Label(textvariable=var1)
l.pack()

root.mainloop()
So möchte ich das auch für Monat und Jahr haben. Wenn der Nutzer seine Eingaben gemacht hat, die auch kontrolliert werden sollen auf ihre Richtigkeit.
Danke im vorraus :!:
BlackJack

@Osterhase: „Wie gesagt”? Also im ersten Beitrag klingt das noch deutlich anders, da ist noch von *einem* Entry die Rede.

Und was hindert Dich nun daran noch zwei Option-Menüs für Monat und Jahr zu machen, das zu einer eigenen Widget-Klasse zusammen zu fassen, die bei jeder Änderung überprüft ob das eingegebene Datum gültig ist, und eine entsprechende Rückmeldung an den Benutzer liefert?

Sternchenimporte sind übrigens Böse™, insbesondere bei Modulen die so gar nicht dafür gedacht sind und wo man sich mal eben über 190 Namen in den aktuellen Modulnamensraum kippt.
BlackJack

Schnellschuss:

Code: Alles auswählen

#!/usr/bin/env python
from __future__ import print_function
import Tkinter as tk
from datetime import date as Date


class DateUI(tk.Frame):
    def __init__(self, master, date=None, start_year=None):
        tk.Frame.__init__(self, master)
        if date is None:
            date = Date.today()
        if start_year is None:
            start_year = Date.today().year - 30
        self.day_var = tk.IntVar(self, date.day)
        self.month_var = tk.IntVar(self, date.month)
        self.year_var = tk.IntVar(self, date.year)
        frame = tk.Frame(self)
        tk.OptionMenu(
            frame, self.day_var, *xrange(1, 32), command=self.validate
        ).pack(side=tk.LEFT)
        tk.OptionMenu(
            frame, self.month_var, *xrange(1, 13), command=self.validate
        ).pack(side=tk.LEFT)
        tk.OptionMenu(
            frame,
            self.year_var,
            *xrange(start_year, Date.today().year + 1),
            command=self.validate
        ).pack(side=tk.LEFT)
        frame.pack(side=tk.TOP)
        self.date_label = tk.Label(self)
        self.date_label.pack(side=tk.TOP)
        self.validate()

    @property
    def date(self):
        return Date(
            self.year_var.get(), self.month_var.get(), self.day_var.get()
        )

    def validate(self, _event=None):
        try:
            self.date_label.configure(
                text=self.date.strftime('%d.%m.%Y'), fg='black'
            )
        except ValueError:
            self.date_label.configure(text='invalid date', fg='red')


def main():
    root = tk.Tk()
    date_ui = DateUI(root)
    date_ui.pack()
    root.mainloop()
    print(date_ui.date)
    

if __name__ == '__main__':
    main()
Antworten