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
Entry, Eingabe der Uhrzeit mit Doppelpunkt
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:
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 ...
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'
Sind es Zeitdifferenzen, die über Mitternacht hinausgehen, müsste man noch was einbauen. Und ein bisschen exception-handling fehlt noch ...
- mkesper
- User
- Beiträge: 919
- Registriert: Montag 20. November 2006, 15:48
- Wohnort: formerly known as mkallas
- Kontaktdaten:
datetime.timedelta() macht sowas.pütone hat geschrieben:Sind es Zeitdifferenzen, die über Mitternacht hinausgehen, müsste man noch was einbauen. Und ein bisschen exception-handling fehlt noch ...

Hi Pütone,
ja, mit 'split' funktioniert es.
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
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()
Ich muß jetzt mal schauen, wie ich das in meinem Programm umsetze.
Danke erstmal!
Grüße
rai
@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.
Und natürlich wäre es keine schlechte Sache, wenn du das ganze objektorientiert aufziehen würdest.
Ü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)
hi pytone,
bin gerade fertig geworden! Dein Code ist jetzt komplett drin.
Das ist auch genau das, was mein Programm macht: Arbeitszeiten berechnen.
(Man könnte natürlich auch 'Excel' nehmen
)
Allerdings für mehrere Mitarbeiter und pro Monat:
Ich schau mal, das ich deinen code ins hauptprogramm bekomme!
Grüße
rai
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()
(Man könnte natürlich auch 'Excel' nehmen

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()
Grüße
rai