Seite 1 von 1

Entry, Eingabe der Uhrzeit mit Doppelpunkt

Verfasst: Mittwoch 19. März 2008, 13:38
von raibel
Hallo,

wie kann ich ein tk.Entry-Feld formatieren, damit ich Uhrzeiten in u.g. Form eingeben und weiterverarbeiten kann?

z.B.: Entry-Eingabe(14:30) - Entry-Eingabe(12:30) = Listbox-Ausgabe(2:00)

Grüße

rai

Verfasst: Mittwoch 19. März 2008, 15:28
von numerix
Soweit mir bekannt ist, kann man für Entry-Felder keine Eingabemaske vorgeben.
Unter der Voraussetzung, dass gültige Zeitangaben eingegeben wurden, könnte man es dann so machen:

Code: Alles auswählen

>>> def zeitdifferenz(z1,z2):
...     zeit1, zeit2 = z1.split(":"),z2.split(":")
...     dauer_min = (int(zeit2[0])-int(zeit1[0]))*60+int(zeit2[1])-int(zeit1[1])
...     return str(dauer_min//60)+":"+str(dauer_min%60).zfill(2)
...
>>> zeitdifferenz("18:10","19:09")
'0:59'
Das Auslesen der Entry-Felder und das Befüllen der Listbox ist vermutlich nicht das Problem.

Sind es Zeitdifferenzen, die über Mitternacht hinausgehen, müsste man noch was einbauen. Und ein bisschen exception-handling fehlt noch ...

Verfasst: Mittwoch 19. März 2008, 17:14
von mkesper
pütone hat geschrieben:Sind es Zeitdifferenzen, die über Mitternacht hinausgehen, müsste man noch was einbauen. Und ein bisschen exception-handling fehlt noch ...
datetime.timedelta() macht sowas. :)

Verfasst: Mittwoch 19. März 2008, 22:20
von raibel
Hi Pütone,

ja, mit 'split' funktioniert es. :-)

Code: Alles auswählen

import Tkinter as tk

root = tk.Tk()
e = tk.Entry(root)
e.grid()
e.insert(tk.END, '')
l = tk.Listbox(root)
l.grid()

def test(event):
    z = e.get()
    z.split(":")
    l.insert(tk.END, z)

e.bind('<KeyPress-Tab>', test)

root.mainloop()
Mir war erstmal nur wichtig, die Daten in der Doppelpunktform aus dem Entry in die Listbox zu bekommen.
Ich muß jetzt mal schauen, wie ich das in meinem Programm umsetze.

Danke erstmal!

Grüße
rai

Verfasst: Mittwoch 19. März 2008, 23:16
von raibel
Storno! Retour! Löschen!

Ich hab gerade gemerkt, das 'split' in meinem Beispielcode gar keine Funktion hat! :oops:

Ich arbeite dran!

Grüße

rai

Verfasst: Donnerstag 20. März 2008, 00:22
von numerix
@raibel

Überhaupt sieht dein Code etwas verworren aus.

Ein Vorschlag: Zwei Entry-Felder, eine Listbox und ein Button. In die Entry-Felder die Uhrzeiten und dann Button klicken.

Per command-option des Buttons eine Funktion aufrufen, die die Entry-Felder ausliest und die beiden Strings als Parameter in die Funktion zeitdifferenz() steckt.
Das, was die Funktion zurückliefert, wird in die Listbox gesetzt.

Code: Alles auswählen

def zeitdifferenz(z1,z2):
    zeit1, zeit2 = z1.split(":"),z2.split(":")
    dauer = (int(zeit2[0])-int(zeit1[0]))*60+int(zeit2[1])-int(zeit1[1])
    return str(dauer//60)+":"+str(dauer%60).zfill(2)
Und natürlich wäre es keine schlechte Sache, wenn du das ganze objektorientiert aufziehen würdest.

Verfasst: Donnerstag 20. März 2008, 00:54
von raibel
hi pytone,

bin gerade fertig geworden! Dein Code ist jetzt komplett drin.


Code: Alles auswählen

import Tkinter as tk

root = tk.Tk()

fl = []
for i in range(1):
    for j in range(2):
        f = tk.Frame(root)
        f.grid(column=i, row=j)
        fl.append(f)
        
list = []
for i in range(2):
    for j in range(1):
        e = tk.Entry(fl[0], width=7)
        e.grid(column=i, row=j)
        e.insert(tk.END, '')
        list.append(e)

l = tk.Listbox(fl[1], width=14)
l.grid()

def test(event):
    l1 = list[0].get() 
    l2 = list[1].get() 
    l1, l2 = l1.split(":"), l2.split(":")
    dauer_min = (int(l2[0])-int(l1[0]))*60+int(l2[1])-int(l1[1])
    z = str(dauer_min//60)+":"+str(dauer_min%60).zfill(2) 

    l.insert(tk.END, z)

e.bind('<KeyPress-Tab>', test)

root.mainloop()
Das ist auch genau das, was mein Programm macht: Arbeitszeiten berechnen.
(Man könnte natürlich auch 'Excel' nehmen :lol:)

Allerdings für mehrere Mitarbeiter und pro Monat:

Code: Alles auswählen

import Tkinter as tk

class Stundenplaner(object):                           
    def __init__(self, master):
        date = tk.Frame(master) #  frame =I=
        date.grid(column=0, row=1)
        
        l1 = []
        for c in range(1, 2): 
            for r in range(3):
                f = tk.Frame(master) #  frame =II=,=III=,=IV=
                f.grid(column=c, row=r)
                l1.append(f) 

        for r in range(1, 32):
            tk.Label(date, text = r, width=4).grid(ipady='1') #  -----> frame =I=
            
        tk.Entry(l1[0], width=10, bg='white').grid(ipadx='3') # -----> frame =II=

        self.d = {}
        for r in range(2, 33):
            for c in range(1, 3):
                entry = tk.Entry(l1[1], width=5, bg='white') # -----> frame =III=
                entry.grid(column=c, row=r)
                entry.insert(tk.END, 0)
                self.d[c, r] = entry
                entry.bind('<KeyPress-Tab>', self.berechnen)
        
        self.listbox = tk.Listbox(l1[2], width=10, height=1, bd='3', relief='ridge') # ----->frame =IV=
        self.listbox.grid(sticky='E', ipadx=2)
        
    def berechnen(self, event):
        list1 = []
        list2 = []
        for i in range(2, 33):
            a = 2, i
            b = 1, i
            x = float(self.d.get(a).get())
            list2.append(x)
            y = float(self.d.get(b).get())
            list1.append(y)
        s1 = sum(list1)
        s2 = sum(list2)
        s1s2 = s2 - s1
        x = self.listbox.insert(tk.END, '%.2f'% s1s2) 
        self.listbox.delete(0, tk.END)
        self.listbox.insert(tk.END, '%.2f'% s1s2) 
        
root = tk.Tk()
for r in range(1):
    for c in range(5): 
        tkT = tk.Frame(root, width=10)
        tkT.grid(column=c, row=r)
        s = Stundenplaner(tkT)    
root.mainloop()
Ich schau mal, das ich deinen code ins hauptprogramm bekomme!

Grüße

rai